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
인스턴스.
그러나 JValue
도 I Int | ... | Json
으로 정의했습니다.
위의 시도에 대해 내가 잘못하고있는 것을 알려주십시오.
기타 - 연습을 위해 노력하고 있으므로 제 ADT를 수정하지 마십시오!
그래서'ghci> JObj "foo"Json | JObj "foo"Json'하지만 분명히 의도 한 바가 아닙니다. –
'JObj'는'Key'와'JValue'를 취합니다. 당신은'Key'와'Json' (Arr은'Json'의 생성자입니다)을 부여했습니다. ADT를 변경하지 않고도 원하는 것을 표현할 수 없습니다. JValue는 단순히 배열을 나타내는 생성자가 없기 때문입니다.'JValue'의'Json' 생성자는'Json' 타입과 * 관계가 없습니다. – user2407038