Haskell:这个方法做了什么

时间:2013-02-19 16:10:52

标签: haskell semantics

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

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分割,如果是 - >&gt;是的,否则。任何人都可以向我详细解释语义吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

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