急に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と表記が違うだけのようだ。