F# 初体験、F# はやっぱり .NET でした。
このエントリは F# Advent Calendar jp 2010 の第13回のものです。
今思い返すと F# 一度も触れたことがない私がこの Calendar に何故登録したのか…
そして、いつの間にか私のところまで順番が回ってきていました。何も考えてない…(;´ρ`)
とりあえず F# も .NET だから一通りのクラスは弄れるよ!という情報は聞いていたので、画像表示アプリでも…
でも何をどうすれば解らないでいたところ、いげ太さんに色々アドバイスを頂き、とりあえず作ることに。
ちなみにいげ太さんから教えてもらったアドバイスは下記の通り。
- どっちにしろデザイナ サポートが受けられないので、ナウでヤングな F# er としては WPF を推したい! .xaml だけポトペタで作って、それ以外は全部 F# コードで書く感じになります。 http://fssnip.net/H
- 名前空間のインポートは using でなく open。let は var みたいなもので、しかも変数も関数もローカル以外でも let を使う。んで (fun 引数 -> 本体) がラムダ式。あと :?> がダウンキャスト(ちなみに :> がアップキャスト)。
- さらに一番大事な、インデントがスコープ ブロックになること(C# でいう { ... } はインデントであらわす!)を押さえておけば、なんとなく書けそうかなーと思いますです。
- あー、それと、F# の event はすべて IEvent を実装するオブジェクトで、C# で += とするところ F# では IEvent.Add メソッドを使う、て違いもありますね。
- せっかくなのでまとめるとこんな感じです。 http://ideone.com/i8lp8 #fsharp #wpf
なんと・・・ F# 触りしか知らない自分に差し迫った F# プログラミング入門 意外と簡単なようで特異な感じを受けます。
いげ太さんに教えてもらったページを確認すると、確かに open が名前空間使用時に使っているし、どことなく .NET ぽさも感じられました。
VS 2010 の F# チュートリアルプロジェクトなどで確認後いざ実践!!!と行きたいところでしたが、ちょっと親ばか自慢もしたかったので、当初の予定通り画像を WPF で表示してみました。
悲しいかな F# 自身のソースは結局 XAML を呼び出すためにしか利用していないという事実…(あかいいぬ君と同じ。)
open System
open System.IO
open System.Windows
[<STAThread>]
[<EntryPoint>]
let main(_) =
let w = Application.LoadComponent(new System.Uri("/FSConsoleApplication1;component/Pict.xaml", System.UriKind.Relative)) :?> Window
(new Application()).Run(w)
XAML 側はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="バックはF#でフロントはWPF!" Height="370" Width="475"> <Grid> <ComboBox Height="24" HorizontalAlignment="Left" Margin="158,0,0,0" VerticalAlignment="Top" Width="120"> <ComboBoxItem> <StackPanel Orientation="Horizontal"> <Image x:Name="img" Source="./P1000711.jpg" Height="16" Margin="3"/> <TextBlock VerticalAlignment="Center">お絵かき中</TextBlock> </StackPanel> </ComboBoxItem> <ComboBoxItem> <StackPanel Orientation="Horizontal"> <Image x:Name="img2" Source="./P1000945.jpg" Height="16" Margin="3"/> <TextBlock VerticalAlignment="Center">もぐもぐ中</TextBlock> </StackPanel> </ComboBoxItem> <ComboBoxItem> <StackPanel Orientation="Horizontal"> <Image x:Name="img3" Source="./P1000961.jpg" Height="16" Margin="3"/> <TextBlock VerticalAlignment="Center">お昼寝中</TextBlock> </StackPanel> </ComboBoxItem> </ComboBox> <Label Content="画像ファイルを選んでね" Height="28" HorizontalAlignment="Left" Margin="0,-4,0,0" VerticalAlignment="Top" IsEnabled="True" /> <Image Height="300" HorizontalAlignment="Left" Margin="0,28,0,0" Stretch="Fill" VerticalAlignment="Top" Width="450" Source="{Binding ElementName=img2, Path=Source}" /> </Grid> </Window> |
ほんとは ComboBox の SelectedValue とかに Image の Source あれば下の Image コントロールにも反映できたんだろうなぁと思いつつ、上のソースでは XAML 内で帰結させる方法がぱっと思い浮かばない…残念ながら時間も無かったため、XAML 内の修正や F# 側からアプリを弄るまではたどり着きませんでした(りばてぃさんに相談してようやく大きい Image にバインディングできたレベル…)。
とりあえず、F# 食わず嫌いから一歩だけ前進できたのは良かったです。あと、雑感。
- いげ太さん優しい!
- プロジェクト内にフォルダ作れないのに衝撃を受けた
- プロパティから出力の種類を選択できるのもビックリ
- F# チュートリアルプロジェクトは構文や使い方を知れるけど、プロジェクト化させる必要はあったのかな…?
- F# + WPF でおもろいサンプル見つけれなかった。
- ほんとは F# + Azure(Worker Role) で何かやりたかったけど、まだまだそこにたどり着けるほど解ってない…
他にも色々あったけど、できなかった、触れた、楽しかった!(F# 部分は前述同様に動作確認して実際のアプリのソースには生かしてないけど…)という感じで。
一応出来たアプリは下記の通り、下の大きい画像は変わりません。折角だからちょっと前に撮った可愛い感じの娘載せておきました。

F# 初体験、F# はやっぱり .NET でした。
#また回ってくるようだったら F# から WPF のイベント弄る所らへんまで触れてみたいなぁ。