■
最近、やむをえない事情によって、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#の説明やサンプルは、断片的には探すと結構あるのだけど、どっかに、まとまった資料があるとよい