最近、やむをえない事情によって、C#を覚えたのだけど、ついでにF#とか使ってみようと思った。ベースになってるのは、Ocamlで、Ocamlの標準ライブラリの大部分を利用できて、.NET Frameworkも簡単に利用できるとか。どうでもいいんだけど、MSには、Erik MeijerとSimon Peyton Jonesがいるんだから、Haskellをベースにしてくれればよかったのに


http://research.microsoft.com/fsharp/release.aspx
v1.1.13.8はなんかインストール時にエラーがでるので、v1.1.12.5をいれた。コンパイラ(fsc)だけでなくて、インタープリタ(fsi)もちゃんとある。Windows以外でも、Monoがあれば動くらしいけど未確認

まあ、Ocamlとか全然分からんのだけど、Ocamlの全ての機能が使えるというわけでもないらしい。けど、

> 2.1 + 3.2;;
val it : float = 5.3
> 2+3;;
val it : int = 5
> 2.1 +. 3.4;;
val it : float = 5.5

浮動小数点演算でも、普通に+が使える。Ocamlだと、+.とかじゃないと型エラーになってダメだった気が。この一点がどうにも嫌いだったので、F#は素晴らしいと思った。まあ、.NETと合わない機能が捨てられてるのかもしれない。そして、Haskellがベースにならなかったのは、あまりにも合わなすぎたとか、そういう事情なんかも


とりあえず、Hello,Worldは

C:\f#>cat hello.fs
print_string "Hello, world!\n";;
printf "Hello, world!\n";;
System.Console.WriteLine "Hello, world!";;
C:\f#>fsc hello.fs
C:\f#>hello
Hello, world!
Hello, world!
Hello, world!

こんな感じ。


Formを開くだけ

#light
open System
open System.Windows.Forms

let form = new Form()
form.Text <- "Hello World Form"
form.Visible <- true
form.Size <- new Drawing.Size(512, 512)

#if COMPILED
[<STAThread>]    
do Application.Run(form)
#endif

#lightとか付けないと、syntax errorになるのは何だろう。caml light構文でパースしてとか、そういう宣言なのかね。全体的にまだ構文がよく分からん。C#使ってて最もあれだったのは、lambdaが欲しいな〜ということだったので(C#3.0には、ラムダ式と呼ばれる物は一応あるけど)、それだけで、F# > C#かな〜と思った


Reflection。foreachは推奨されてないとか警告出るけど、iterだと型推論エラーになるっぽいので。というか、OcamlのArrayと.NETの配列を一緒くたにしてるのがまずいのか。そんくらい面倒見てくれよ〜とか思うけど

#light
open System
open System.Reflection

let x = 3
let members = x.GetType().GetMembers()
do Array.foreach members (fun m->print_endline m.Name)

F#の説明やサンプルは、断片的には探すと結構あるのだけど、どっかに、まとまった資料があるとよい