OSC2011 HokkaidoでF#のお話をしてきました

OSC2011 Hokkaidoで『これからの「言語」の話をしよう ―― 未来を生きるためのツール』という講演をしてきました。
事前登録は83名でしたが、当日は椅子を追加していたようなので、100人ほどいたかもしれません。
女性も何名かいらっしゃいました。F#がよく似合いそうなお綺麗な方々でした!


発表資料はSkyDriveとSlideShareにアップしました。
Silverlightをお使いの方はSkyDriveのWebAppで閲覧すると、より一層美味しく召し上がれます。

半数以上の方が「関数型言語に興味がある」とのことで、中には隠れF#ユーザもいました。「F#の街札幌」ならではの光景です。


手続き型というのは、言ってみればコンピュータ寄りのパラダイムで、人間のことはそれほど考えられていません。だから我々はバグに苦しみました。マルチスレッドに悩みました。
そこで人間を救うために現れたのが関数型です。天使です。
関数型の世界では、関数を抽象的に扱うことで、関数合成や高階関数などが可能になります。
これによって柔軟にプログラムが書けるようになります。
また、「変数の値は変更できない!」という、一見厳しい制約も、実は人間のためのルールなのです。
これにより、我々はバグの呪縛から解放されますし、並列計算に苦労しなくなります。
書き換え可能な変数というのは、どうしてもバグの温床となってしまいます。


OCamlHaskellなど、関数型言語には洗練された良い言語が多いですが、
F#はそれらの英知をくみ取り、未来を見据えて開発された最先端の関数型言語です。
F#はIDEまでも無料でお使いいただけます
学んで損はないと思います!

Demonstration !

スライドにはデモの様子が載っていませんので、簡単にご紹介しておきます。
はじめのデモは、対話環境でWindows Formを扱いました。
一瞬でFormが表示された時はちょっと「ざわ・・・ざわ・・・」となりましたが、
その後Buttonを追加しようが、Clickイベントを追加しようが特にリアクションも無くて、いい感じに死にたくなりました。


続いて、FSharpChartというグラフコントロールをお見せしました。
もともと導入は非常に簡単ですが、デモ用にあらかじめハッキング(!)したものを使用しました。
例えば、以下の式を評価すると・・・

> [for _ in  0..10 -> r.Next(1, 50)] |> FSharpChart.Column ;;

このようなグラフが表示されます。サンプルデータは乱数を使って生成しています。


他にはこんなのも。

> [][("Haskell", 5); ("F#", 20); ("Scala", 7); ("Lisp", 3)][]
|> FSharpChart.Pie ;;

このデータはフィクションであり、実在の言語とは関係ありません。たぶん。


以下のようにレーダーチャートでブイブイ言わせることもできます。

> [ for _ in 1..5 -> r.Next(3, 10) ] |> FSharpChart.Radar ;;


以下は、複数のグラフを統合して1つのグラフにしています。

> FSharpChart.Combine
[ FSharpChart.Line [ for f in 0.0 .. 0.1 .. 10.0 -> sin f ]
FSharpChart.Line [ for f in 0.0 .. 0.1 .. 10.0 -> cos f ] ] ;;


このような例を次々とお見せしました。
会場が「おぉー」となるかなと期待していましたが静まり返っていたので、そのまま窓から身を投げようかと思いました。



セッションの後半には、並列計算のデモをやりました。
以下のようなアプリケーションを用意しました。


「通常」というボタンを押すと1本のスレッドで4枚の画像を処理し、
「並列」というボタンを押すと4本のスレッドでそれぞれ画像を処理します。
「通常」に処理すると以下のようになります。


「並列」で処理すると以下のようになります。

スレッドは4本ありますが、マシンがデュアルコアなのでおよそ2本ずつ処理されます。


プログラムの主要部分は以下のようになっています。

/// 画像をネガティブ化します
let effectNegative (c : Color) =
    let rgb = List.map (int >> (-) 255) (c.ToList())
    Color.FromArgb(rgb.[0], rgb.[1], rgb.[2])

/// PictureBoxの画像を更新します
let updateImage box = (* 画面を更新するだけなので割愛します *)

// 通常計算!
let Normal controls = Array.iter updateImage controls


// 並列計算オブジェクトを作成する関数
let effect_Async box = async { do updateImage box }

// 並列計算!
let Parallel controls =
    Array.map effect_Async controls
    |> Async.Parallel
    |> Async.RunSynchronously |> ignore

(全プログラムはこちら)
F#では並列計算オブジェクト(非同期計算オブジェクト、Asyncオブジェクト)というものを使って並列計算を表現します。
このオブジェクトは、「async式」を使うことで得ることができます。
そして、計算をラップしたこのオブジェクトをAsyncクラスのメソッドに渡してやると、いよいよスレッドが走り始めます。
小難しいことは一切意識しませんでしたが、たったこれだけで複数のコアを有効活用するプログラムが書けました。



Q & A

Q&Aの時間にいただいたご質問と、その回答を簡単にまとめておきます。
Q. FSharpChartってコントロール?標準で使えるの?
A. もともと.NET Frameworkに含まれているものをF#流にカスタマイズしたもの。非公式ライブラリだが、簡単に導入できる。
Q. スマートフォンの開発に使えるとあったが、具体的にどのスマフォに使えるの?
A. Windows Phone。id:nakayoshixさん集中力欠如(!)。Androidでmonoが動けば行けるかも?調査が足りなくて、あまり良い回答ができず。。
Q. 基本的にWindowsアプリ専用言語なの?
A. F#はマルチプラットフォーム。F#は宗教の垣根を超える!
Q. テスティング・フレームワークってあるの?
A. FsUnitとかNaturalSpecがあります。NaturalSpecを使うと面白いテストの書き方ができる。
Q. 入門におすすめの、分かりやすい関数型言語は?
A. Haskellは美しいので個人的に好きだが、小難しい概念が付いて回るので、やはり・・・F#!! (←なぜか会場がウケる)
Q. F#で作られているWebサービスとか、事例とか無いの?
A. Bingの広告配信機構の一部(機械学習)にF#が使われている。海外では金融系でも使われているみたい。
Q. K泉さん自身とか、周りの人で実際に仕事で使った人とかっている?
A. 札幌ではまだない。旭川ではぜくる兄者が色々企んでいる。
Q. F#ってまだ未完成なイメージ!F#でSilverlightなどを書く際にエディタがサポートしてくれない。
A. 言語仕様とは別に、開発環境のサポートはまだ弱い。フォームデザイナもないし、Silverlightも書きやすくはない。でも今後改善されることと思う。
Q. 関数型言語の弱点ってあるの?
A. ん〜、手続き型言語が嫌いになること?(←意外と会場ウケた) もうC#でプログラム書く気にはなれない。
A. 今のは冗談だが、弱点らしい弱点が思いつかない。OCamlハッカーtmaedaさんどう思いますか?→ 「ん〜、無い!」『ですよね〜!』
Q. 関数型言語はそんなにいいのに、なぜ今まで使われなかった?
A. 実用性の面?ライブラリとか開発環境は正直弱かったかも。F#は.NETも使えるし、VSもあるし、問題ないですね!学習意欲さえあれば移り変わってゆける!
Q. デバッガってあるの?ステップ実行とかできるの?(関数型では難しそう)
A. (時間切れでお答えできず)


最後のご質問にここで簡単に回答を。
デバッガは一応付いていますが、手続き型のデバッガをそのまま流用しているため、正直使いやすくはないかもしれません。
関数合成だとか部分適用だとかに対応した、言ってみれば関数型に特化したデバッガが今後出てくると嬉しいですね。

まとめ

発表のあと声をかけて下さった方が沢山いました。
興味を持っていただけて嬉しかったです。
オンラインでも気軽に話しかけてください。


また、「F#の勉強会ってあるんですか?」とか、「やらないんですか?」といったお声をいただきました。需要があるならやるかもしれません!


あと、id:stknohgさんがツイートをまとめて下さっています。ありがとうございます!GJ!
OSC 2011 Hokkaido - これからの「言語」の話をしよう ―― 未来を生きるためのツール まとめ - Togetter


さあみんな、なまらF#しよう!
F# User Group - Japan