lab01: impl json
This commit is contained in:
49
lab01/JSON.hs
Normal file
49
lab01/JSON.hs
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
---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]
|
||||||
15
lab01/jsonDriver.hs
Normal file
15
lab01/jsonDriver.hs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import JSON
|
||||||
|
|
||||||
|
testNested = JObject [
|
||||||
|
("name", JObject [("first",JString "Tyrion"), ("last",JString "Lannister")]),
|
||||||
|
("age", JNumber 32),
|
||||||
|
("siblings", JArray [
|
||||||
|
JString "Jamie",
|
||||||
|
JString "Cersei"]),
|
||||||
|
("pet", JNull)]
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = let arr = JSON.jsonRightTriangles
|
||||||
|
in do
|
||||||
|
putStrLn $ JSON.toString arr
|
||||||
|
putStrLn $ JSON.toString testNested
|
||||||
Reference in New Issue
Block a user