50 lines
1.4 KiB
Haskell
50 lines
1.4 KiB
Haskell
---SOLUTION
|
|
-- A JSON library written in Haskell, adapted from an example
|
|
-- from "Real World Haskell".
|
|
|
|
-- Note that the module name must match the name of the file.
|
|
module JSON (
|
|
JValue(..), --The (..) means that we are exporting the type and all of its constructors
|
|
toString,
|
|
isNull,
|
|
jsonRightTriangles)
|
|
where
|
|
|
|
data JValue = JString String
|
|
| JNumber Double
|
|
| JBool Bool
|
|
| JNull
|
|
| JObject [(String, JValue)]
|
|
| JArray [JValue]
|
|
deriving (Eq, Ord, Show)
|
|
|
|
|
|
--The type annotation indicates that the function takes a JValue and returns a String
|
|
toString :: JValue -> String
|
|
toString (JString s) = "\"" ++ s ++ "\""
|
|
toString (JNumber n) = show n
|
|
toString (JBool True) = "true"
|
|
toString (JBool False) = "false"
|
|
toString JNull = "null"
|
|
toString (JArray lst) = "[" ++ list2str lst ++ "]"
|
|
toString (JObject obj) = "{\n" ++ obj2str obj ++ "\n}"
|
|
|
|
list2str :: [JValue] -> String
|
|
list2str [] = ""
|
|
list2str (x:[]) = (toString x)
|
|
list2str (x:xs) = (toString x) ++ ",\n " ++ (list2str xs)
|
|
|
|
obj2str :: [(String, JValue)] -> String
|
|
obj2str [] = ""
|
|
obj2str ((k,v):[]) = k ++ ":" ++ toString v
|
|
obj2str ((k,v):xs) = k ++ ":" ++ toString v ++ "," ++ obj2str xs
|
|
|
|
isNull JNull = True
|
|
isNull _ = False
|
|
|
|
jsonRightTriangles = JArray [ JObject [("a",JNumber a), ("b",JNumber b), ("c",JNumber c)] |
|
|
a<-[1..10],
|
|
b<-[1..10],
|
|
c<-[1..10],
|
|
a^2 + b^2 == c^2]
|