2013-02-19 82 views
2

在我的測試考試中,一個問題是,這個方法做了什麼。Haskell:這個方法做什麼

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的所有數字,其中%數字== 0.因此,這是所有偶數?它似乎檢查數字是否可以通過2分割,如果是 - > false,否則返回。任何人都可以向我詳細解釋語義嗎?

+8

找出最好的方法是打破多個函數中的表達式,並在REPL中評估它們。 '[2..div a 2]'返回從2到a/2的整數列表。 – Simon 2013-02-19 16:13:56

回答

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 
6

它是檢查數字是否爲素數的基本算法。它遍歷從2a/2的所有數字,並檢查它是否有任何分開a,如果列表爲空,則表示它沒有2a/2之間的因子,這意味着數字是素數。

+0

這個算法是* bad *。只需要檢查數字是否可以被**的平方不大於數字的**素數**整除。 – Ingo 2013-02-19 19:26:20

+0

@Ingo我不是在說這個算法。這是他考試中提出的問題,所以我只是解釋它的作用。你不能在考試中回答問題「你的算法不是最優的,所以我不會回答這個問題」。 – Satvik 2013-02-20 04:33:19

+2

我知道,我只是想提一下它,以免有人認爲這是一個愚蠢的功課問題算法。 – Ingo 2013-02-20 07:18:11