获取Multiline haskell函数在ghci中工作

时间:2016-08-11 01:39:04

标签: haskell ghci

我创建了这个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中是一件很难的事情。

3 个答案:

答案 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)