Haskell:解析输入“ =”中的错误,其中

时间:2018-11-11 07:47:45

标签: haskell

我是Haskell的新手,并且在Haskell中练习算法遵循《函数算法设计的珍珠》一书

这是一种在给定的自然数有限集合X中找不到最小自然数的算法

import Data.List
import Data.Array

minfree xs = if null ([0..b-1] \\ us)
             then head ([b..] \\ vs)
             else head ([0..b-1] \\ us)
             where (us, vs) = (partition (<b) xs)
                          b = div (length xs) 2

Pff这样的编译器错误

Prelude Data.Array Data.List> :load 01_the_smallest_free_number.hs 
[1 of 1] Compiling Main             ( 01_the_smallest_free_number.hs, interpreted )

01_the_smallest_free_number.hs:11:29: error:
    parse error on input ‘=’
    Perhaps you need a 'let' in a 'do' block?
    e.g. 'let x = 5' instead of 'x = 5'
   |
11 |                           b = div (length xs) 2 
   |                             ^
Failed, no modules loaded.

在我let之前添加b并不是我尝试过的正确答案。

然后我将所有可用的b替换为div (length xs) 2,看来这是问题所在,但我不明白

1 个答案:

答案 0 :(得分:7)

这是错误的缩进:

     where (us, vs) = (partition (<b) xs)
                  b = div (length xs) 2

由于第二个等式比第一个等式缩进更多,因此它将继续第一个等式,就像我们写的一样

     where (us, vs) = (partition (<b) xs) b = div (length xs) 2

触发错误。

您反而想要:

     where (us, vs) = (partition (<b) xs)
           b        = div (length xs) 2

以便两个方程式以相同的方式缩进。