-- 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 が行える。