2015-02-05 16 views
0

我正在爲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,否則,因爲我正在爲它練習!

+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的構造函數。沒有爲Key [JValue]

2

沒有這樣的構造這是錯誤的

data JValue = ... 
      | Json 

,因爲它具有聲明值構造名Json carring沒有數據可言,這是完全無關的Json類型。你想代替:然後

data JValue = ... 
      | J Json 

你舉的例子就變成:

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

這是不可能與當前的ADT。我不會糾正你的ADT,但我必須指出問題所在。

您可能希望JObj中的值爲Json類型。然後可以使用Arr或JObj作爲JObj中的值。

另一個問題:您的JObj只能保存一個密鑰和一個值。在JSON中,對象包含多個鍵值條目。

如果你讓Json類型代表任何JSON值,我沒有看到JValue的目的,儘管它也可以讓JValue包含一個Json,但是你需要一個帶有Json類型參數的構造函數作爲由chi指出。

這會更清楚一個例子,但它會毀了你的excercise。