2016-11-11 2 views
-1

String 생성자를 사용하여 Text를 aeson Value에 패턴 일치 시키려고하는데 컴파일 오류가 발생했습니다. 다음 예제 프로그램은 제가 지금까지 실행 해 왔던 문제를 보여줍니다. 내가 아이손의 '문자열'값 생성자에 패턴 일치에 "여기"텍스트를 얻기 위해 노력하고 같이왜 Aeson은 패턴 일치 텍스트가 아닙니까?

{-# LANGUAGE OverloadedStrings #-} 

import qualified Data.Text 
import qualified Data.Aeson 

main = print $ 
    case ("here" :: Data.Text.Text) of 
    (Data.Aeson.String x) -> "match" 
    _      -> "no match" 

. 나는이 프로그램이 Aeson String과 Text를 일치시키고 "match"를 출력해야한다고 생각한다. 그러나 프로그램은 컴파일되지 않습니다. 대신 다음과 같은 오류 메시지가 나타납니다.

$ ghc scratch.hs 
[1 of 1] Compiling Main    (scratch.hs, scratch.o) 

scratch.hs:9:4: error: 
    • Couldn't match expected type ‘Data.Text.Text’ 
        with actual type ‘Data.Aeson.Value’ 
    • In the pattern: Data.Aeson.String x 
     In a case alternative: (Data.Aeson.String x) -> "match" 
     In the second argument of ‘($)’, namely 
     ‘case ("here" :: Data.Text.Text) of { 
      (Data.Aeson.String x) -> "match" 
      _ -> "no match" }’ 

실제 유형은 aeson 값이지만 반면에 예상되는 문자가 표시됩니다. 그러나 그것은 분명히 타입 주석 ("here":: Data.Text.Text)으로 표시된 텍스트입니다. 왜이 오류가 발생하는지 이해할 수 없습니다. 문자열 생성자를 통해 텍스트를 aeson 값에 패턴 일치시키는 작업이 this aeson tutorial에서 완료된 것으로 보입니다. 여기서는 내 예제에서 작동하지 않는 이유가 표시되지 않습니다.

+0

실제로 유형 불일치가 있으며 튜토리얼과 동일한 작업을 수행하지 않는다고 확신합니다. 이유를 알아 보려면 'Data.Aeson.String x'의 유형을 고려하십시오. – duplode

+0

튜토리얼에서는 어디에서 나타나는 것으로 보입니까? –

답변

1

It says the pattern expected Text whereas the actual type was aeson Value. But it is clearly Text as marked by the type annotation

일치하는 값은 실제로 Text입니다. 그러나 일치하는 패턴은 Text 유형의 패턴이 아닙니다. 대신, 이것은 Value 유형의 패턴입니다. 명백한 이유로 한 유형의 값을 다른 유형의 패턴과 비교할 수 없습니다.

수정할 가능성이 많지만 제안하려는 것을 선택하기가 어렵습니다. 사용자가하려는 일에 대해 거의 말하지 않았기 때문에.

case decode (fromStrict (encodeUtf8 "\"match\"")) of 
    Just (String x) -> "match" 
    Just _ -> "no match" 
    Nothing -> "invalid JSON" 

그러나, 나는 당신이 실제로 단지 아이손 사용하는 방법을 오해하고, 그 FromJSON를 작성해야한다고 생각 : 아마당신은 ValueText을 분석하고 그것이 값의 종류를 확인하고자했다 인스턴스를 사용하거나 (기존의 인스턴스를 사용하는 것) Text 값을 직접 쓰려고하지 마십시오. 이러한 제안 모두 인한 문제를 조명하는 방법을 순수 추측이다, 다시

case decode "\"match\"" of 
    Just v -> Data.Text.putStrLn v 
    Nothing -> putStrLn "invalid JSON" 

을 더 큰-사진에 예를 들어, 쓰기, 당신이 Text의 기존 FromJSON 인스턴스를 재사용 할 수 Text로 JSON 값을 구문 분석 목표.