Project Euler 1(1)

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"というやつなんでしょうか。次回は関数型らしく書いてみましょう。