我是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
,看来这是问题所在,但我不明白
答案 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
以便两个方程式以相同的方式缩进。