让 Multiline haskell 函数在 ghci 中工作

Getting Multiline haskell function to work in ghci

我创建了这个 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 中,缩进似乎很难解决。

您的 if 语句需要至少缩进一个 space:

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>

可能还需要注意的是,如果您不在 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)

我在 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]