Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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 - Fatal编程技术网

为什么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

此代码旨在将平衡三元表示转换为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 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只需要缩进。附带问题:为什么要使用前缀运算符?我认为在数字之间使用运算符是最容易的,因为它们应该被使用。此外,当您修复解析错误时,程序会给出几个类型错误;当您去掉前缀操作符(或者至少将它们括起来)时,这些可能会消失。