我创建了这个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页面,了解了一些常见的mistable新手将会犯的错误,并按如下所示更改了代码
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中,缩进似乎是一件很困难的事情。
发布于 2016-08-11 09:53:50
您的if语句需要至少多缩进一个空格:
Prelude> let removeOdds nums =
Prelude| if null nums
Complete example:
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|
Prelude>发布于 2016-08-11 13:15:13
在定义多行函数时,我在GHCi中使用大括号。它们允许您像通常编写的那样粘贴一大块Haskell代码。
λ :{
| let
| -- type or paste here, e.g.,
| removeOdds :: Integral a => [a] -> [a]
| removeOdds nums =
| if null nums
| then []
| else -- ...
| :}
λ removeOdds [1,2,3,4]
[2,4]发布于 2016-08-11 10:09:40
值得注意的是,如果您不在REPL中,因此不需要let,那么您就不需要如此多的缩进:
removeOdds nums =
if null nums
then []
else
if (mod (head nums) 2) == 0
then (head nums) : (removeOdds(tail nums))
else removeOdds(tail nums)https://stackoverflow.com/questions/38886002
复制相似问题