我创建了这个haskell函数来从列表中删除奇数并尝试使用ghci。虽然我已启用多行模式并使用4个空格进行缩进,但我仍然收到下面的错误。
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)
:11:5: 解析错误(可能是错误的缩进或括号不匹配)
我在this页面上看到了常见的有问题的新手会做的事情,我改变了我的代码,如下所示
ListedColormap
现在我以新错误结束了。看起来缩进在haskell中是一件很难的事情。
答案 0 :(得分:4)
您的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>
答案 1 :(得分:2)
在定义多行函数时,我在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]
答案 2 :(得分:1)
当您不在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)