http://projecteuler.net/index.php?section=problems&id=1
これからProject Eulerの問題を解きながらF#を学んでいきます。F#についてはまだほとんどわかっていません。
環境
F#はVisual Studio 2010 beta2をインストールすると使えます。IDEを使ってもいいですが、ここではコマンドラインを使います(Visual Studioは重過ぎる)。Visual Studio コマンド プロンプト(Microsoft Visual Studio 2010 - Visual Studio Tools)を使うとよいでしょう。
リファレンスは、Visual F#(MSDN)です。
インタプリタとコンパイラ
let N = 1000; let mutable s = 0 for i in 1..N-1 do if i % 3 = 0 || i % 5 = 0 then s <- s + i printfn "%d" s
このテキストを拡張子.fsで保存して、コマンドラインに
>fsi euler001.fs
などと入力します。そうするとインタプリタが起動して、メッセージと共に答えが出力されます。インタプリタから抜けるには、
> #quit;;
あるいは
> #q;;
と入力します。めんどうですね。
コンパイラを使うには、コマンドラインに
>fsc euler001.fs
と入力します。するとeuler001.exeというファイルが作成されるのでこれを実行します。
Problem 1
さて、さきほどのコードを見ていきましょう。
let N = 1000; let mutable s = 0 for i in 1..N-1 do if i % 3 = 0 || i % 5 = 0 then s <- s + i printfn "%d" s
1行ずつ見ていきましょう。
let N = 1000;
letで識別子に値や関数を束縛するんだそうです。最初の行はNに1000を束縛しています。
let mutable s = 0
関数型の言語なので当然値は不変、と思いきや、mutableを付けるとあっさり可変になってしまいます。
for i in 1..N-1 do
そんな調子なのでfor文もしっかりあります。1..N-1はリスト、ではないようです。よくわかりません。単なるシンタックスの問題なのでしょうか。リストも使えます。IEnumerableというインターフェイスを継承していればいいようです。
if i % 3 = 0 || i % 5 = 0 then
ifもふつうに使えます。equalは"=="ではなくて"="なんですね。
s <- s + i
"<-"が代入の演算子のようです。
printfn "%d" s
これは見ての通りでしょう。
こうしてみると、とても関数型とは思えませんね。これが"Multiple-Paradigm Language"というやつなんでしょうか。次回は関数型らしく書いてみましょう。