カテゴリー : F#

F# メモ Hello World

Hello, World プログラム

なにはともあれ、ハローワールドを書かないと話は進みません。

printfn "Hello, World"

コンパイルする場合はこれで良いのですが、インタプリタで実行する場合は行末に ;; が必要。


シンプルな関数を作成する

let Cube x = x * x * x

printfn "%d" (Cube 8)

1行目で3乗の値を返す関数を作っています。


複数のソースファイルをコンパイルする

Visual Studioで複数のファイルを作ってコンパイルし、実行すると、上から順に実行されます。
上からというのはソリューションエクスプローラで表示されている順ということです。
この順番はAlt+↑、Alt+↓で変更できます。

F# メモ インストール

http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/release.aspx
からダウンロードできます。
VS2010では標準でF#が使えるようです。

そういえば今日気づいたんですが、Visual Studio 2010 RC版が公開されてました。
F#だけのためにインストールします。

はじめてのF#

関数型プログラミングが面白そうだったのでF#を試してみることにしました。
資料が少ないので、とりあえずmsdnの記事を参考にしています。
一通り読んだところで(理解は出来ていませんが)Project Euler の Problem 1 に挑戦してみました。

10未満の自然数のうち、3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり、 これらの合計は 23 になる。

同じようにして、1,000 未満の 3 か 5 の倍数になっている数字の合計を求めよ。

試行錯誤の末、最初にコンパイルが通ったのが以下のコード。再帰バージョンです。

1
2
3
4
5
6
7
8
printfn "Problem 1"

let rec Problem1 x total =
    if x = 0 then total
    elif x % 3 = 0 || x % 5 = 0 then Problem1 (x-1) (total+x)
    else Problem1 (x-1) total
   
printfn "> %d" (Problem1 999 0)

もうちょっと短くしたいと思って書いたのが以下のコード。リストバージョンです。

1
2
3
4
5
6
7
8
9
10
printfn "Problem 1"

(* let rec Problem1 x total =
    if x = 0 then total
    elif x % 3 = 0 || x % 5 = 0 then Problem1 (x-1) (total+x)
    else Problem1 (x-1) total
   
printfn "> %d" (Problem1 999 0) *)


printfn "> %d" ([1..999] |> List.filter (fun a -> a%3=0 || a%5=0) |> List.sum)

List.filterやList.sumの使い方が合っているか分からないのですが、一応答えは求められています。
比較用:C#で解いたもの

投稿時に気づきました。
CodeColorer(ソースコードのハイライト用ツール)がF#に対応していない・・・。

TOP

INFORMATION

未来の自分のためのメモ
管理者:rei