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 而 '\''
是一个单引号(没有 \
,第二个 ' 将被视为字符文字的结尾)。
因此,当您编写 '\'
时,词法分析器会看到字符文字的开头,后跟转义的 '
。现在它期望另一个 '
来关闭字符文字,但得到一个冒号,导致错误。
要将反斜杠表示为字符文字,您可以使用另一个反斜杠对反斜杠进行转义,如下所示:'\'
.
我想写一些东西来读取 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 而 '\''
是一个单引号(没有 \
,第二个 ' 将被视为字符文字的结尾)。
因此,当您编写 '\'
时,词法分析器会看到字符文字的开头,后跟转义的 '
。现在它期望另一个 '
来关闭字符文字,但得到一个冒号,导致错误。
要将反斜杠表示为字符文字,您可以使用另一个反斜杠对反斜杠进行转义,如下所示:'\'
.