我正在爲JSON定義一個代數數據類型(ADT)。製作Haskell 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
上面的代碼編譯。不過,我想提出以下JSON在我的ADT時迷茫:
{"foo" : [1,2,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])
我有所瞭解了錯誤信息,因爲(Arr [I 1, I 2, I 3])
是,事實上,一個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