5回目のHaskell

今日のお題は"fractoriz.c"素因数分解です。アルゴリズムは至って簡単で2から初めて割りまくってだんだん大きい値で割っていき、最終的に√nまで割る数が着たら終了という。まあ言葉で説明するの大変だから適当に検索かけてください(ぉ
割る数は理想的には素数列を使うのがよいのですが、素数列を作るのにも時間がかかるので結果的に何も考えずに下から順番に割ったほうがおそらく速いです。元のサンプルは、2以外の素数は全て奇数という性質を利用してちょっとだけ高速化してますが私は面倒なので総当りにしました(ぉ

main = do n <- getLine >>= return . read
          print( factoriz n )

factoriz = subFactoriz 2
    where subFactoriz s n | n < s * s    = [n]
                          | mod n s == 0 = s : subFactoriz s ( div n s )
                          | otherwise    = subFactoriz ( s + 1 ) n

今までと違って数値を入力出来ます!と言ってもIOモナドを理解したわけじゃありません。単に参考書のサンプルプログラムをコピペしただけですorz まあなんとなく">>="とか"return"とかがどんなものかはわかってきたつもりなんですが、まあきっと気のせいでしょう(ぉ
特に注目すべき点は無いと思いますが、今回ちょっと感動(?)したのが整数専用の演算があること。最初、C++の習慣で”n % s”とか”n / s”とか書いちゃってエラー出まくり。まあでもこのくらい型に厳密な方が私も好きです。C++ももっと厳しくなって欲しいです(^^;