Ebe*_*ley 2 haskell lambda-calculus lexical
我正在尝试编写一些读取Lambda表达式并输出beta缩减版本的内容.Lambdas的输入方式如下:\ variable - > expression和applications将采用(表达式)(表达式)的形式.因此,如果在字符串的开头找到'\',它知道处理一个Lambda,如果找到'(',它知道处理一个应用程序.
我有一个Lambda表达式定义的类型:
data Expression = Variable String
| Lambda Expression Expression
| Apply Expression Expression
Run Code Online (Sandbox Code Playgroud)
这是我第一次尝试编写读取输入的函数
processInput :: String -> Expression
processInput ('\':input) = processLambda input
processInput ('(':input) = processApply input
processInput str = Variable str
Run Code Online (Sandbox Code Playgroud)
当我尝试加载此功能时,我得到了
lexical error in string/character literal at ':'
Run Code Online (Sandbox Code Playgroud)
所以我尝试使用警卫:
processInput input
| head input == '\' = processLambda (tail input)
| head input == '(' = processApply (tail input)
| otherwise = Variable input
Run Code Online (Sandbox Code Playgroud)
但得到了
lexical error in string/character literal at character ' '
Run Code Online (Sandbox Code Playgroud)
我不知道这些功能有什么问题.
反斜杠是字符串和字符文字中的特殊字符.您可以使用它来表示不可打印的字符,换行符和字符,否则这些字符在文字中具有特殊含义.例如,'\n'换行符'\b'是后退空格并且'\''是单引号(没有\,第二个'将被视为字符文字的结尾).
所以当你写作时'\',词法分析器会看到一个字符文字的开头,然后是一个转义字符'.现在它期望另一个'关闭字符文字,但是得到一个冒号,导致错误.
为了表示一个反斜杠字符文字,你逃跑用这样一个反斜杠反斜杠:'\\'.