apostrophes/character 文字在 Haskell 中是如何解析的?

How are apostrophes/character literals parsed in Haskell?

我想写一些东西来读取 Lambda 表达式并输出一个 beta 简化版本。 Lambdas 的类型如下:\variable -> expression 和应用程序将采用 (expression) (expression) 的形式。因此,如果在字符串的开头找到“\”,它就知道要处理 Lambda,如果找到“(”,它就知道要处理应用程序。

我定义了 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 ' '

我不知道这两个函数有什么问题。

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

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

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

反斜杠是字符串和字符文字中的特殊字符。您用来表示不可打印的字符、换行符和在其他情况下在文字中具有特殊含义的字符。例如 '\n' 是一个换行符 '\b' 是一个后退 space 而 '\'' 是一个单引号(没有 \,第二个 ' 将被视为字符文字的结尾)。

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

要将反斜杠表示为字符文字,您可以使用另一个反斜杠对反斜杠进行转义,如下所示:'\'.