Haskell缩进错误。小学阶段

时间:2013-01-23 06:42:06

标签: haskell

我正在上一个介绍Haskell的课程。 我对这种语言完全陌生。

当我编译它时,它说:

[1 of 1] Compiling Main             ( hw1.hs, interpreted )
hw1.hs:11:1: parse error (possibly incorrect indentation)
Failed, modules loaded: none.

有人可以解释我做错了什么吗? 非常感谢你。

P.S。 我从网上得到了一段代码(称为素数)。 我不明白那个代码,如果有人能详细说明,那就好了。 我不明白这个功能,筛子是什么。它是内置的haskell功能吗?

2 个答案:

答案 0 :(得分:8)

除了@ertes关于反推的内容之外,还有一些问题。幸运的是,其中两个很容易修复!

首先,let中的let num = [1..]应该被删除:在.hs文件中你不需要这些(但是你在GHCi中这样做,一开始可能会让人感到困惑)。这就是给你缩进错误的原因。一旦你解决了这个问题,你就会遇到一些类型错误。

其次,在partCpartD中,您可以撰写t <- [zip num fibs/primes]。这意味着t依次绑定到单元素列表[zip num ...]的每个元素。 zip num fibs/primes已经是一个列表,因此您不需要括号。修复此程序后,程序将编译,但无法正常工作。

最后,如果您尝试通过检查某个数字是否是元素,来确定某个数字(在您的情况下为fst t,又在partCpartD中)是素数还是斐波纳契数primesfibs,当数字实际位于列表中时会起作用,但如果不是,则不会返回False。这是因为elem不知道您正在查看的列表是按升序排序的。例如,如果你试图评估elem 4 primes它将检查4是否等于2,3,5,7,11,依此类推 - 谁知道,4最终可能会出现!要解决此问题,您必须编写一个稍微更智能的elem - 函数。

答案 1 :(得分:7)

第11行你刚刚将撇号与反叛混淆:

fst t 'elem' primes

应该是:

fst t `elem` primes