2016-08-11 47 views
2

我创建了这个haskell函数来从列表中删除奇数,并尝试在ghci中。尽管我已启用多行模式并使用4个空格作为缩进,但我仍然收到以下错误。让多行haskell函数工作在ghci

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) 

现在我结束了一个新的错误。在哈斯克尔看来,缩进是一件困难的事情。

+1

顺便说一句 - 在ghci中输入多行语句是一种痛苦。我通常使用一个编辑器窗口并行运行ghci的控制台窗口。用'ghci program.hs'调用ghci。在编辑器中更改它后,使用':r'重新加载'program.hs'。还可以看看':e'和':set editor'命令。请参阅GHCi手册中的[__Loading source files__](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#loading-source-files)。 – ErikR

+0

多行函数的一个常见来源是重新发明轮子:'let removeOdds = filter even'。 – chepner

回答

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> 
+0

前奏> MOD(头[10,20,30])/ 2 :153:1:在约束 非类型变量参数:分数(一 - >一) (使用FlexibleContexts允许这样) 在检查“它”是否具有推断的类型 时::它确实是a。 (分数(a - > a),积分a)=> a - > a – randominstanceOfLivingThing

+0

condition should read'(mod(head nums)2)== 0' – randominstanceOfLivingThing

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) 
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]