Project Euler 1

急にHaskellをやってみようと思い、インストールして、少し調べて、Project EulerのProblem 1を書いてみた。2時間かかった。


まず、
http://haskell.org/
からダウンロードして、デフォルトでインストール。
そして、適当なサイトを見て、こう書いて、test.hsというファイル名で保存。


main = print(1 + 2)

コマンドプロンプトをこのファイルのフォルダで立ち上げて、


>test.hs

そうすると、色々文が出てきて、


*Main>

とプロンプトが現れる。そこに、


*Main> main

と打つと、ちゃんと


*Main> main
3
*Main>

と表示された。
これを抜けるのはどうやるのだろうと色々調べたが、


*Main> :quit

とする。そうするとコマンドプロンプトに戻る。やってみたら、


*Main> :q

でもよかった。viみたいな感じ?
さて、とにかく、


main = ...

と書くと、main関数が定義されるらしい。
さて、次にProblem 1である。まずはリストを作る。


main = print([1..10])

とすると、


*Main> main
[1,2,3,4,5,6,7,8,9,10]
*Main>

となった。
次に、


N = 10
main = print([1..N])

としたら、エラーとなった。なんなんだ、変数使えないのかよ、と思って色々見ていたら、


n = 10
main = print([1..n])

は動いた。大文字はダメなんだろうか。
次は関数の定義である。数学でf(x) = x + 1に相当するものは、


f x = x + 1

と書ける。だから、


n = 10
f x = x + 1
main = print(map f [1..n])

なら、


*Main> main
[2,3,4,5,6,7,8,9,10,11]
*Main>

となる。mapはPythonなどと同じである。filterも同じ。


n = 10
f x = mod x 3 == 0
main = print(filter f [1..n])

modが剰余を求める関数で、比較演算子はCと同様である。


*Main> main
[3,6,9]
*Main>

これで、Problem 1の答えが書ける。


size = 1000
div35 n = mod n 3 == 0 || mod n 5 == 0
main = print(sum(filter div35 [ 1..size-1 ]))

ここまでは、Pythonと表記が違うだけのようだ。