2015-01-07 142 views
1

我正在閱讀Real World Haskell第5章(編寫JSON渲染器)。Doc數據值構造函數Char和Text之間的區別

data JValue = JString String 
      | JNumber Double 
      | JBool Bool 
      | JNull 
      ... 

data Doc = Empty 
     | Char Char 
     | Text String 
     | Concat Doc Doc 
     .... 

我無法理解的字符和文本文件(文件值構造)之間的差值 。

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

我懷疑你錯過了一些上下文。 – dfeuer

回答

2

Text需要String參數。 Char取值爲單個Char。定義:

data Doc = Empty 
     | Char Char 
     | Text String 
     | Line 
     | Concat Doc Doc 
     | Union Doc Doc 
      deriving (Show,Eq) 

你的例子有一個類型的錯誤,現在看來,因爲你傳遞一個「\ n」到文本的最後一行。

+0

謝謝。這是我的錯誤。我修改了它。文本字符串可以表示爲Char。在本書中,如果字符串包含轉義字符,例如JValue('\ x1ff':'\ x1ff':[]),則生成文本「\ x1ff」'Concat'文本「\ x1ff」。我認爲這可能是Char'\ x1ff''Concat' Char'\ x1ff'。我認爲文本值構造函數是沒用的。我很困惑。 –

+0

@Don Stewart:那爲什麼還有一個單獨的'Char'構造函數,與使用'Text相比,它有什麼優勢? (:[])'? – Cactus

+0

字符和文本是不同的類型。例如,您可能希望使用單引號打印一個,使用雙引號打印一個。 –

相關問題