Haskell中如何分析撇号/字符文字?

Haskell中如何分析撇号/字符文字?

问题描述:

我试图写一些读取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 ' ' 

我不知道这有什么错要么这些功能。

反斜线在字符串和字符特殊字符。你用来表示不可打印的字符,换行符和字符,否则在文字中会有特殊含义。例如'\n'是换行符'\b'是后退空格而'\''是单引号(没有\,第二个'将被视为字符文字的结尾)。

因此,当您编写'\'时,词法分析器会看到字符文字的开头,然后是转义的'。现在,它期望另一个'关闭字符字面值,但会得到一个冒号,导致错误。

要将反斜杠表示为字符文字,请使用另一个反斜杠来跳转反斜杠,如下所示:'\\'

反斜杠是转义字符,所以它需要加倍表示单个反斜杠:'\\'

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

-- or... 
processInput input 
    | head input == '\\'      = processLambda (tail input) 
...