2

在我的考试中,一个问题是,这种方法是做什么的。

dos a = ([x | x <- [2..div a 2], mod a x == 0] == [])

我是 Haskell 的新手,但据我所知,它会检查结果dos a = ([x | x <- [2..div a 2], mod a x == 0])是否为空列表。x 也是a除以 2 且 %number == 0 的所有数字。因此这都是偶数吗?似乎它检查数字是否可被 2 整除,如果是 -> false,否则。谁能详细解释一下语义?

4

2 回答 2

9

你很接近正在发生的事情。有几个组件需要理解。

首先,[2 .. div a 2]生成从 2 到 的数字列表floor(a / 2)

接下来,mod a x == 0过滤掉从 2 到floor(a / 2)除数的值a(例如,它找到 的所有因数a)。因此,由生成的列表

[x | x <- [2 .. div a 2], mod a x == 0]

包含除 的所有数字a

最后,== []检查该列表是否为空(例如a,没有因子)。所以,这个函数实际上做的是通过尝试生成它的因子来确定一个数字是否是素数,当你dos用作过滤器的谓词时很容易看到:

Prelude> let dos a = ([x | x <- [2..div a 2], mod a x == 0] == [])
Prelude> :t dos
dos :: Integral t => t -> Bool
Prelude> filter dos [2 .. 100]
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97] -- Prime goodness
于 2013-02-19T16:21:12.293 回答
6

它是检查数字是否为素数的基本算法。它遍历从2to的所有数字a/2并检查其中是否有任何除以a,如果列表为空,则表示它之间没有因子2a/2这意味着该数字是素数。

于 2013-02-19T16:22:41.180 回答