2015-02-05 2 views
0

JSON의 대수 데이터 형식 (ADT)을 정의하고 있습니다.하스켈 만들기 JSON ADT

type Key = String 

data Json = JObj Key JValue 
      | Arr [JValue] 
      deriving Show 

data JValue = I Int 
       | F Float 
       | S String 
       | B Bool 
       | Json 
       deriving Show 

위의 코드가 컴파일됩니다. 하지만, 내 ADT에 다음 JSON을 만들려고 할 때 혼란 스러워요 :

{"foo" : [1,2,3] }

내 시도 : (Arr [I 1, I 2, I 3])이기 때문에

ghci> JObj "foo" (Arr [I 1, I 2, I 3]) 

<interactive>:101:13: 
    Couldn't match expected type ‘JValue’ with actual type ‘Json’ 
    In the second argument of ‘JObj’, namely ‘(Arr [I 1, I 2, I 3])’ 
    In the expression: JObj "foo" (Arr [I 1, I 2, I 3]) 

내가 다소 오류 메시지를 이해, 사실, a Json 인스턴스.

그러나 JValueI Int | ... | Json으로 정의했습니다.

위의 시도에 대해 내가 잘못하고있는 것을 알려주십시오.

기타 - 연습을 위해 노력하고 있으므로 제 ADT를 수정하지 마십시오!

+0

그래서'ghci> JObj "foo"Json | JObj "foo"Json'하지만 분명히 의도 한 바가 아닙니다. –

+3

'JObj'는'Key'와'JValue'를 취합니다. 당신은'Key'와'Json' (Arr은'Json'의 생성자입니다)을 부여했습니다. ADT를 변경하지 않고도 원하는 것을 표현할 수 없습니다. JValue는 단순히 배열을 나타내는 생성자가 없기 때문입니다.'JValue'의'Json' 생성자는'Json' 타입과 * 관계가 없습니다. – user2407038

답변

1

실습을 위해이 작업을 수행하고 있기 때문에 대답이 다소 모호합니다. 그러나 첫 번째 Json 생성자의 정의에 작은 오타가있을 가능성이 높습니다.

특히 Arr [JValue]Json 유형의 생성자입니다. 이 값 생성자는 Json 유형 완전히 관련이 전혀 데이터를 CARRING없는 이름 Json을 가진 선언 이후이

data JValue = ... 
      | Json 

잘못 Key [JValue]

2

에 대한 이러한 생성자가 없습니다. 대신 원하는 :

data JValue = ... 
      | J Json 

귀하의 예는 다음이된다 :

JObj "foo" (J (Arr [I 1, I 2, I 3])) 
0

은 현재 ADT 불가능합니다. 귀하의 ADT를 수정하지는 않지만 문제를 지적해야합니다.

아마도 JObj의 값이 Json 유형이되기를 원할 것입니다. 그런 다음 JObj 내부의 값으로 Arr 또는 JObj를 사용할 수 있습니다.

또 다른 문제점 : JObj에는 하나의 키와 하나의 값만 저장할 수 있습니다. JSON에서 객체는 여러 개의 키 - 값 엔트리를 포함합니다.

Json 유형이 JSON 값을 나타내도록하면 JValue의 목적이 표시되지 않지만 JValue에 Json이 포함되도록 할 수도 있지만 Json 유형의 매개 변수로 생성자가 필요합니다. chi가 지적했다.

예를 들어 더 명확 해 지겠지만 운동을 망칠 수 있습니다.