Haskell:这个方法做了什么

blu*_*ile 2 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分割,如果是 - >假,否则.任何人都可以向我详细解释语义吗?

sab*_*uma 9

你接近正在发生的事情.有几个组件需要了解.

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

接下来,mod a x == 0过滤出floor(a / 2)除以2的值a(例如,它找到所有因子a).因此,生成的列表

[x | x <- [2 .. div a 2], mod a x == 0]
Run Code Online (Sandbox Code Playgroud)

包含所有划分的数字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
Run Code Online (Sandbox Code Playgroud)


Sat*_*vik 6

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

  • 我知道,我只是想提一下,以免任何人认为这是一个愚蠢的家庭作业问题算法. (2认同)