【发布时间】:2016-08-11 01:39:04
【问题描述】:
我创建了这个 haskell 函数来从列表中删除奇数,并在 ghci 中尝试。尽管我启用了多行模式并使用 4 个空格进行缩进,但我仍然收到以下错误。
Prelude> :set +m
Prelude> let removeOdds nums =
Prelude| if null nums
Prelude| then []
Prelude| else
Prelude| if (mod (head nums)/2) == 0
Prelude| then (head nums) : (removeOdds(tail nums))
Prelude| else removeOdds(tail nums)
Prelude|
:11:5: 解析错误(可能是缩进不正确或括号不匹配)
我阅读了this 页面,了解常见的可混淆新手的做法,我将代码更改如下
Prelude> let removeOdds nums =
Prelude| do if null nums
Prelude| then []
Prelude| else
Prelude| do if mod((head nums)/2) == 0
Prelude| then head nums: removeOdds(tail nums)
Prelude| else removeOdds(tail nums)
Prelude|
<interactive>:47:5:
parse error (possibly incorrect indentation or mismatched brackets)
现在我以一个新错误结束。看起来缩进在haskell中很难解决。
【问题讨论】:
-
顺便说一句 - 在 ghci 中输入多行语句很痛苦。我通常将编辑器窗口与运行 ghci 的控制台窗口并排使用。使用
ghci program.hs调用 ghci。在编辑器中更改后,使用:r重新加载program.hs。还可以查看:e和:set editor命令。另请参阅 GHCi 手册中的Loading source files。 -
多行函数的一个常见来源是重新发明轮子:
let removeOdds = filter even。