wvogel日記

自分用の技術備忘録が多めです.

F#入門

今日はMicrosoftの提供する関数型言語、F#に触る!

というわけで、win7を起動して導入。
どのように導入したらよいかわからなかったので、他のサイトを参考にして進めさせていただきました。

ttp://winterradish.web.fc2.com/10/50compiler.html
をみながら。
Visual studio shell の integratedをインストール
②F#本体をインストール。


まずはインタプリタが動くかどうか。
②でインストールしたフォルダないのbinフォルダにパスを通してからコマンドプロンプトを起動。

fsi

と打つと、無事インタプリタが起動しました。


次に、コンパイラが動くかどうか。

visual studio 2010を立ち上げます。
なお、私はvisual C++ 2008 express editionを同PCで使用していますが、それに関しては何の問題もないようです。
ただ、ライセンス登録は、C++のもので自動的に行ってくれているよう。
ここらへんがMicrosoftは親切


さっそく、C++ express edition同様、新規プロジェクトを作成。

日本語がソースコード内で何の処理をせずとも扱えるのは便利。

printfn "This is test!"

Ctrl+Shift+B でビルド、
Ctrl+F5 で実行です。
無事動作確認終了!


文法が、同じ関数型とはいえHaskellと大分異なる印象を受けたので少しずつ慣れることにしましょう。
まずはHaskellでいうところの、zipWith関数を書いた。

let rec zipWith f xs ys =
 if xs = [] || ys = []
  then []
  else f (List.head xs) (List.head ys)
       :: zipWith f (List.tail xs) (List.tail ys);;

zipWith (+) [1..4] [5..8] |> printfn "%A"

結果は[6,8,10,12]
予想どおりですね
Haskellでは

Prelude> let fibo = 1:1:zipWith (+) fibo (tail fibo)
Prelude> take 10 fibo
[1,1,2,3,5,8,13,21,34,55]

のようなことができるので、F#も出来るだろうと思って同様に

let rec fibo = 1::1:: zipWith (+) fibo (List.tail fibo);;

のようにしたけど見事にコンパイルを通らない.....
自身の定義に自身を使うのはできないよと言われています。
再帰的な呼び出しとは違うのか。

.Netクラスライブラリ利用可だし、Visualなもの作るならHaskellよりは確実に楽でしょう。
ただ、名前空間あったり、再帰関数書くときrecを書かないといけなかったり、可読性ではHaskellには劣ると思われる。
慣れの問題もあるでしょうが笑
ちょっと色々なサイトでF#の使用例覗いたけれど、エディタだったり画像だったり。GUIには強いイメージ。
そういえばC#でのバイトをしている友人がいるけれど、たしかC#も.Netプラットフォーム利用できるはず.....


.Netって無駄に多機能で汚いイメージが強くて触りたいとも思わなかったけれど、ちゃんと使えれば大きな武器になりそうです。


Python同様、少しずつ学習していきます