我正在上一个介绍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功能吗?
答案 0 :(得分:8)
除了@ertes关于反推的内容之外,还有一些问题。幸运的是,其中两个很容易修复!
首先,let
中的let num = [1..]
应该被删除:在.hs文件中你不需要这些(但是你在GHCi中这样做,一开始可能会让人感到困惑)。这就是给你缩进错误的原因。一旦你解决了这个问题,你就会遇到一些类型错误。
其次,在partC
和partD
中,您可以撰写t <- [zip num fibs/primes]
。这意味着t
依次绑定到单元素列表[zip num ...]
的每个元素。 zip num fibs/primes
已经是一个列表,因此您不需要括号。修复此程序后,程序将编译,但无法正常工作。
最后,如果您尝试通过检查某个数字是否是元素,来确定某个数字(在您的情况下为fst t
,又在partC
和partD
中)是素数还是斐波纳契数primes
或fibs
,当数字实际位于列表中时会起作用,但如果不是,则不会返回False
。这是因为elem
不知道您正在查看的列表是按升序排序的。例如,如果你试图评估elem 4 primes
它将检查4是否等于2,3,5,7,11,依此类推 - 谁知道,4最终可能会出现!要解决此问题,您必须编写一个稍微更智能的elem
- 函数。
答案 1 :(得分:7)
第11行你刚刚将撇号与反叛混淆:
fst t 'elem' primes
应该是:
fst t `elem` primes