2017-08-17 46 views
2

我試圖寫一些讀取Lambda表達式並輸出一個測試版縮小版。 Lambdas將按如下方式鍵入:\ variable - >表達式和應用程序的形式(表達式)(表達式)。所以,如果「\」是在字符串的開頭找到它知道來處理Lambda和如果「(」發現它知道處理申請Haskell中如何分析撇號/字符文字?

我已經定義爲Lambda表達式類型:

data Expression = Variable String 
       | Lambda Expression Expression 
       | Apply Expression Expression 

這是我在寫一個函數讀取輸入

processInput :: String -> Expression 
processInput ('\':input) = processLambda input 
processInput ('(':input) = processApply input 
processInput str   = Variable str 

第一次嘗試當我嘗試加載這一功能,我得到

lexical error in string/character literal at ':' 

所以我試圖用後衛來代替:

processInput input 
    | head input == '\'      = processLambda (tail input) 
    | head input == '('      = processApply (tail input) 
    | otherwise        = Variable input 

,但得到

lexical error in string/character literal at character ' ' 

我不知道這有什麼錯要麼這些功能。

回答

6

反斜線在字符串和字符特殊字符。你用來表示不可打印的字符,換行符和字符,否則在文字中會有特殊含義。例如'\n'是換行符'\b'是後退空格而'\''是單引號(沒有\,第二個'將被視爲字符文字的結尾)。

因此,當您編寫'\'時,詞法分析器會看到字符文字的開頭,然後是轉義的'。現在,它期望另一個'關閉字符字面值,但會得到一個冒號,導致錯誤。

要將反斜槓表示爲字符文字,請使用另一個反斜槓來跳轉反斜槓,如下所示:'\\'

2

反斜槓是轉義字符,所以它需要加倍表示單個反斜槓:'\\'

processInput ('\\':input) = processLambda input 
... 

-- or... 
processInput input 
    | head input == '\\'      = processLambda (tail input) 
... 
相關問題