Haskellでエラトステネスの篩

先日Pythonで実装してみました。Haskellでもできたので書いておきます。

getPrimeList [] = []
getPrimeList (x:xs) = x : getPrimeList [y|y<-xs,mod y x /= 0]

getPrimeListN n = getPrimeList [2..n]

すごく短いですね。さすがHaskellです。まずgetPrimeListでは渡されたリストから先頭の数(つまり素数)を素数のリストに追加しつつ残りのリストからその数で割り切れない数を素数の候補として再帰的にgetPrimeListに渡しています。
リストが空になったらパターンマッチを使って空のリストを使って終了です。
あとは使いやすいようにNまでの素数を返す関数としてgetPrimeListNを定義してみました。
コードがアルゴリズムを素直に表現してていいですね。
ただ、まだ全然文法に慣れていないのですごいH本を参照しつつ、エラーを出しつつな状況...もっとHaskellかけるようになりたいものです。