如何在Haskell中解析撇号/字符文字?
我试图写一些东西来读取Lambda表达式并输出一个beta版本。lambda的类型如下:\variable->expression,应用程序的形式为(expression)(expression)。因此,如果在字符串的开头找到“\”它知道如何处理Lambda,如果找到“(”它知道如何处理应用程序 我定义了Lambda表达式的类型:如何在Haskell中解析撇号/字符文字?,haskell,lambda-calculus,lexical,Haskell,Lambda Calculus,Lexical,我试图写一些东西来读取Lambda表达式并输出一个beta版本。lambda的类型如下:\variable->expression,应用程序的形式为(expression)(expression)。因此,如果在字符串的开头找到“\”它知道如何处理Lambda,如果找到“(”它知道如何处理应用程序 我定义了Lambda表达式的类型: data Expression = Variable String | Lambda Expression Expression
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('\\':输入)=processLambda输入
...
--或者。。。
进程输入
|头部输入=='\\'=processLambda(尾部输入)
...
反斜杠是字符串和字符文本中的一个特殊字符。用于表示不可打印的字符、换行符和在文本中具有特殊含义的字符。例如,'\n'
是换行符'\b'
是空格,'\'
是单引号(如果没有\
,第二个“将被视为字符文字的结尾)
因此,当您编写'\'
时,lexer会看到字符文本的开头,后面是转义的'
。现在它希望另一个'
关闭字符文本,但会得到冒号,从而导致错误
要将反斜杠表示为字符文字,可以使用另一个反斜杠来转义反斜杠,如下所示:'\\'