2010年2月4日木曜日

F# 始めました

メニーコア時代に向けてマルチスレッド化しやすい関数型言語に手を出してみようかと思ってF#を少しいじってみました。

環境構築

VisualStudio 2010 のベータが今は配られてるのでそいつを入れればOK。ゆくゆくはF# Expressとかになるのかな?

(追記:コメント欄で情報をいただきました。どうやらVisualStudio2010 F# Expressの提供予定は無いそうです。残念。ただ、他の無償ツールと組み合わせて擬似的にF#の無償環境を構築することはできるそうです。
参考URL: Re: Visual Studio 2010 F# Express Edition: biac の それさえもおそらくは幸せな日々@nifty )

F#

関数型言語ということで、今までの言語とは概念が違うのでとっつきにくい。ただ、数ある関数型言語の中からこいつを今回選んだのはC#で使ってた.net Framework の関数群を使うことができるから。

なので、処理や基本的なIO周りはC#の知識が使えて純粋に処理の構造についてのみ関数型言語の特徴を体験できるんじゃないかと
あと、同じ.net Framework上で動くのでC#からF#、F#からC#の相互呼び出しがいろいろできそう?という期待も込めて
C#でフォームデザインUIを作って、処理の並列化をF#で書いてその中での個々の処理をまたC#に戻ってくる・・・みたいな流れがそれぞれの言語の特徴を生かした感じでイケテルんじゃないかと

まぁでもきっと、慣れてるC#だけで並列化の処理も書いた方が早いんだろうけどねw

Hello World

printfn "Hello World"
この簡潔さはとっつきやすくていいね。スクリプト言語っぽい感じでよいです。
Javaを始めて触ろうと思った時にエントリーポイントが static なんちゃらのMainだかなんかで、いきなりつまずいたのを思い出した。

ひっかかったところ

いわゆるチュートリアル的な説明は別のところに任せます。
ここは個人的に引っかかったところのメモなどを・・・

・open 予約語
いわゆるusingですね

・let 予約語
変数宣言のvarみたいな感じだけど、実際は関数定義に近い感じ
let a = 5 って書くと変数を宣言して代入しているように見えるけど、もうこのaは変更できないらしい。常にconstな感じ?この制約があるがために並列化しやすいらしい
let func x = x + 1 //こうやると関数宣言っぽい。
let func (s:string) = printfn "%s" s //こうやって引数を型で縛れるようだ。これやっとくとIntelliSenseが効いて便利

・.net Framework関数呼び出し
open System.IO
let target_files = Directory.GetFiles(@"C:\TargetFolder", "*.xml", SearchOption.AllDirectories)
for i in target_files do printfn "%s" i
読めるよね、しかも分かりやすいと思う。こうやって簡単に.net Frameworkの関数が呼べるのは可能性を感じる。今回この言語に一番惹かれたところ

・fold
関数型言語の特徴として再起呼び出しを使った処理がよく取り上げられるけど、今回一番アハッてなったのがこのfold関数(高階関数)
let x = List.fold 関数 初期値 処理するリスト
という感じに使う。たとえば数値リストのリスト[[1]; [1;2]; []; [3;4;5]] みたいのを連結して [1;1;2;3;4;5]を作りたい時とかに使える。
let x = List.fold (@) [] target_list //こんな感じになる。
この(@)にシビレタ! @演算子はリストの連結で、処理的には fun a b -> a @ b という感じになるんだけどそれが(@)と省略できる・・・なんかカコイイ 俺の厨二心をくすぐるw

・printfn "%A"
これ、どうもオブジェクトをテキストとして表示してくれる便利関数なんだけど、巨大なリストを表示するとどうも最後の方が省略されちゃうみたい。... みたいな表示になっててそれに気づかず処理したデータが出ない!ってずいぶん迷ってしまった。

感想

というわけで、まだ並列化高速化のところまでは到達してないけど可能性を感じる言語だった。
なにより.net Frameworkとの連携が魅力的。いざとなればF#的に書きにくい処理を関数ごと別言語で実装できそうだしね

4 件のコメント:

いげ太 さんのコメント...

VS Shell による無償環境は提供が継続されるようですが、残念なことに Express は提供されないんですよね。2010 の次のバージョンに期待です。

http://bluewatersoft.cocolog-nifty.com/blog/2009/11/re-visual-studi.html

Chishow さんのコメント...

情報ありがとうございます。
エントリーに追記しておきました。
そうですか、F# Express期待してたんですがちょっと残念です。

蛇無 さんのコメント...

F#とな?
始めて聞く言語・・・。
D言語は知ってるけど、Eは何処行った?w

Chishow さんのコメント...

たしかにE言語ってないんですかねぇ
別にアルファベット順に増えてるわけじゃないか・・・
F#のFってやっぱり関数言語ってことでfunctionのFなんだろうか?