修改haskell函数以正确运行

时间:2018-01-20 13:53:19

标签: list haskell primes

我有以下haskell代码:

a (b : bs) = b : [c | c <- (a bs), c `rem` b /= 0]

有人可以解释这段代码的作用吗? 运行as

a [3,5..42]

返回

  Prelude> a [3,5..42]
[3,5,7,11,13,17,19,23,29,31,37,41*** Exception: <interactive>:71:1-46: Non-exhaustive patterns in function a

从我所看到的,该功能就像Eratosthenes的Sieve一样。该函数将b视为素数并过滤掉b的倍数。但我不确定如何。最重要的是,该函数抛出此异常。

1 个答案:

答案 0 :(得分:6)

这里有一个递归函数:您在定义中调用a bs。最终bs将是空列表,此时你会得到一个例外。例如,您可以在代码中添加以下行:

a [] = []

然后输出将变为:

[3,5,7,11,13,17,19,23,29,31,37,41]

至于这个函数的作用,它返回列表中的每个元素,它不是列表中任何前一个元素的倍数。如果您给它一个列表[2..x],其中x是任何整数,这与从2x的所有素数列表相同。

获得素数列表的另一种方法是你找到的那个: 从3开始,使Haskell列表理解跳过任何2的倍数。