「Real World Haskell」読書メモ(117) 4.ライブラリを書く 5.2 HaskellにおけるJSONデータ表現

-- SimpleJSON.hs
data JValue = JString String
            | JNumber Double
            | JBool Bool
            | JNull
            | JObject [(String, JValue)]
            | JArray [JValue]
              deriving (Eq, Ord, Show)
Main> :t JString "foo"       -- JString "foo"の型はJValue
JString "foo" :: JValue

Main> :t "foo"               -- JString "foo"の型は[Char]
"foo" :: [Char]

Main> (JString "foo")== (JString "foo") -- 比較できる
True
Main> (JString "foo")== "foo"           -- 比較出来ない


<interactive>:1:18:
    Couldn't match expected type `JValue'
           against inferred type `[Char]'
    In the second argument of `(==)', namely `"foo"'
    In the expression: (JString "foo") == "foo"
    In the definition of `it': it = (JString "foo") == "foo"

-- 型の値を使うときはパターンマッチングで取り出す。
Main> let len (JString s)= length s
Main> len (JString "foo")
3
-- リストの要素同じ型でなければならないが、これは同じ型のタプルなのでOK。
Main> JObject  [("name", (JString "Haskell")),("height", (JNumber 171.5))]
JObject [("name",JString "Haskell"),("height",JNumber 171.5)]

-- JArray は JValueを要素とするリスト。同じ型なのでOK。
Main> JArray [JObject  [("name", (JString "Haskell")),("height", (JNumber 171.5))],JNull,JBool True]
JArray [JObject [("name",JString "Haskell"),("height",JNumber 171.5)],JNull,JBool True]

deriving (Eq, Ord, Show) 宣言をしているので JValue型の値は ==、>、<、>=、<=、show が行える。