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%number == 0 を持つ 2 で割った数です。したがって、これはすべて偶数ですか? 数値が 2 で割り切れるかどうか、そうでない場合は false -> そうでない場合はチェックするようです。セマンティックを詳しく説明してくれる人はいますか?

4

2 に答える 2

9

あなたは何が起こっているかに近いです。理解すべきいくつかのコンポーネントがあります。

まず、[2 .. div a 2]2からまでの数字のリストを生成しfloor(a / 2)ます。

次に、除数mod a x == 0する2からの値を除外します(たとえば、のすべての因子を検出します)。したがって、によって生成されたリストfloor(a / 2)aa

[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

素数かどうかを調べる基本的なアルゴリズムです。2からまでのすべての数値をトラバースし、a/2いずれかが を割るかどうかをチェックします。リストが空の場合、 と の間にa因数がないことを意味し、これは数値が素数であることを意味します。2a/2

于 2013-02-19T16:22:41.180 に答える