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

时间:2017-08-17 18:41:44

标签: haskell lambda-calculus lexical

我正在尝试编写一些读取Lambda表达式并输出beta缩减版本的内容。 Lambdas的输入方式如下:\ variable - >表达式和应用程序将采用(表达式)(表达式)的形式。因此,如果在字符串的开头找到'\',它知道处理一个Lambda,如果找到'(',它知道处理一个应用程序。

我为Lambda Expressions定义了一个类型:

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 ' '

我不知道这些功能有什么问题。

2 个答案:

答案 0 :(得分:6)

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

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

要将反斜杠表示为字符文字,请使用另一个反斜杠转义反斜杠:'\\'

答案 1 :(得分:2)

反斜杠是转义字符,因此需要加倍才能表示单个反斜杠:<h3>My friends</h3> <div id="demo"></div>

'\\'