为什么Haskell会抱怨这个加号?
此代码旨在将平衡三元表示转换为Haskell为什么Haskell会抱怨这个加号?,haskell,Haskell,此代码旨在将平衡三元表示转换为Haskell整数: frombal3 :: String -> Integer frombal3 "+" = 1 frombal3 "0" = 0 frombal3 "-" = -1 frombal3 current:therest = \ (*) frombal3 current (^) 3 length therest \ + frombal3 therest 我得到了一个错误: main.hs:7:3: error: parse erro
整数
:
frombal3 :: String -> Integer
frombal3 "+" = 1
frombal3 "0" = 0
frombal3 "-" = -1
frombal3 current:therest = \
(*) frombal3 current (^) 3 length therest \
+ frombal3 therest
我得到了一个错误:
main.hs:7:3: error: parse error on input ‘+’
|
7 | + frombal3 therest
| ^
<interactive>:3:1: error:
• Variable not in scope: main
• Perhaps you meant ‘min’ (imported from Prelude)
main.hs:7:3:错误:在输入“+”时分析错误
|
7 |+从BAL3开始
| ^
:3:1:错误:
•变量不在范围内:主
•您的意思可能是“min”(从Prelude导入)
不要使用反斜杠,记住正确地将模式匹配括起来:
frombal3 :: String -> Integer
frombal3 "+" = 1
frombal3 "0" = 0
frombal3 "-" = -1
frombal3 (current:therest) = -- ^ Note brackets
(*) frombal3 current (^) 3 length therest
+ frombal3 therest
由于您如何使用运算符,这仍然会导致一个问题,但我认为您可以自己解决这个问题,特别是因为我无法确定您在这里尝试执行的操作。您似乎试图使用反斜杠继续下一行;不要那样做。如果删除所有反斜杠,错误就会消失。(您将获得其他几个错误,但这一个错误将消失。)
Haskell使用缩进来检测一个零件的结束位置和下一个零件的开始位置。您不需要在每行末尾手动添加反斜杠来继续表达式。不清楚您想要实现什么,但我可以看到一些已经指出的错误 问题 您不需要
\
来继续一行,只需要在字符串中继续。在Haskell中,缩进就足够了
您需要将模式匹配用括号括起来:(current:therest)
。此外,此模式将使成为当前的
字符而不是字符串,因此不能直接将其传递给接受字符串的函数
您还需要包装函数参数:如果要将BAL3 current的乘以3,则需要(*)(frombal3 current)3
,或者更好的frombal3 current*3
。中缀函数具有更高的优先级,使代码更清晰
建议
我不确定您想要实现什么,但这看起来像是可以通过折叠
或简单的列表理解来完成的事情不要使用反斜杠继续一行。Haskell只需要缩进。附带问题:为什么要使用前缀运算符?我认为在数字之间使用运算符是最容易的,因为它们应该被使用。此外,当您修复解析错误时,程序会给出几个类型错误;当您去掉前缀操作符(或者至少将它们括起来)时,这些可能会消失。