Doc数据值构造函数Char和Text之间的区别

时间:2015-01-07 11:07:11

标签: haskell

我正在阅读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"

区分字符和文字有什么好处?

1 个答案:

答案 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。