Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Haskell中解析撇号/字符文字?_Haskell_Lambda Calculus_Lexical - Fatal编程技术网

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

如何在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

我试图写一些东西来读取Lambda表达式并输出一个beta版本。lambda的类型如下:\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('\\':输入)=processLambda输入
...
--或者。。。
进程输入
|头部输入=='\\'=processLambda(尾部输入)
...

反斜杠是字符串和字符文本中的一个特殊字符。用于表示不可打印的字符、换行符和在文本中具有特殊含义的字符。例如,
'\n'
是换行符
'\b'
是空格,
'\'
是单引号(如果没有
\
,第二个“将被视为字符文字的结尾)

因此,当您编写
'\'
时,lexer会看到字符文本的开头,后面是转义的
'
。现在它希望另一个
'
关闭字符文本,但会得到冒号,从而导致错误

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