我正在阅读Real World Haskell,第5章(编写JSON渲染器)。
data JValue = JString String
| JNumber Double
| JBool Bool
| JNull
...
data Doc = Empty
| Char Char
| Text String
| Concat Doc Doc
....
我无法理解其中的区别 Char和Text之间(Doc Value Constructor)。
renderJValue :: JValue -> Doc
renderJValue (JNumber n) = Text $ show n
renderJValue (JBool b) = Text $ show b
renderJValue JNull = Text "null"
renderJValue (JString (a:b:[])) = render a `Concat` render b
where render c = if isEscapeChar(c)
then Text (c : [])
else Char c
renderJValue $ JNumber 3
= Text "3"
renderJValue $ JNull
= Text "null"
renderJValue $ JString ("null")
= Char 'n' `Concat` Char 'u' `Concat` Char 'l' `Concat` Char 'l'
renderJValue $ JString ('a' : '\n' : [])
= Char 'a' `Concat` Text "\n"
区分字符和文字有什么好处?
答案 0 :(得分:2)
Text
需要String
个参数。 Char
只需Char
个值data Doc = Empty
| Char Char
| Text String
| Line
| Concat Doc Doc
| Union Doc Doc
deriving (Show,Eq)
。按照定义:
{{1}}
您的示例似乎有类型错误,因为您在最后一行传递了'\ n'到Text。