Your SlideShare is downloading. ×
0
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
マルチパラダイムで行こうIn f#
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

マルチパラダイムで行こうIn f#

2,181

Published on

かn

かn

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,181
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
9
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  1. マルチパラダイム で行こう! in F#
  2. 自己紹介HN : ながとツイッター : @nagat01ブログ : ながとダイアリー主なプログラミング歴Visual Basicの本を中学生の時に、友達が読んでいるのを目撃して自分もやってみた→すぐ挫折w大学生の時に、教養の授業でJavaをやったり、ロボコンサークルで電子工作のためにPICのアセンブラ、マイコンのC言語など
  3. 作ったもの Haskell将棋 第21回世界コンピュータ将棋選手権に参加 関数型言語で実装して参加した例は、これが初めて 結果は一次予選で3勝3敗1引き分け コード行数は600行以下駒や指し手を代数的データ型で表現したが、それがパフォーマンス上の致命傷となり、1秒あたり500手程度しか読めなかった・・。Haskellでの開発難しすぎるおっおっ!!参考リンク:Haskell将棋のアピール文書
  4. そして F#! F#! Visual Studioに標準搭載IDEの支援を受けられる 簡単 正格評価パフォーマンスが出やすい 簡単 非純粋関数型副作用が普通に使える 簡単 .NETライブラリ既存のライブラリが使える 簡単
  5. つまり・・F#は・・
  6. F#の話F#において特徴的な、以下のトピックを紹介致します。 第1章:スクリプティング 第2章:OOP 第3章:副作用F#の言語機能・開発環境で、エレガントで効率的なコードが本当に書けるのか?煩雑になりやすいGUIの作成で検証します。
  7. 第1章:スクリプティングF# interactiveを使おうスクリプティングでGUIを構築イベントハンドラの動作を確認コントロールの直接操作GUIのプロパティ値を取得
  8. F# interactive(Fsi)を使おう .fsxというスクリプトファイルを作る #load “hoge.fsx” // Fsiに読み込む Alt + ^ : カーソル行を送る Alt + Enter : 選択範囲を送る no-コンパイル。不整合なコードでもOK WPFアプリの実行に必要なdllをロード#r "PresentationCore"#r "PresentationFramework"#r "System.Xaml"#r "WindowsBase"
  9. スクリプティングでGUIを構築 空のウィンドウを作るopen System.Windowslet window = Window()window.Title <- "My Window"window.Show() 範囲選択->Alt + Enter
  10. コンパイルせず、修正を繰り返す// ウィンドウにボタンを追加。let button = new Button() 範囲選択window.Content <- button Alt+Enter// ボタンに文字列を追加。button.Content <- 範囲選択 "重要なお知らせ" Alt+Enter// やっぱり消す 範囲選択window.Content <- null Alt+Enter
  11. イベントハンドラの準備をして・・// メッセージボックスを表示する関数let msg (text:string)= MessageBox.Show(text,"ながと銀行") |> ignore// ボタンにイベントを追加するイベントハンドラの作成let myEventHandler = let delete全財産 _ _ = msg "あなたの預金のデータは消えてしまいました。" new RoutedEventHandler(delete全財産)
  12. イベントの動作を確認// ボタンにイベントハンドラを追加するbutton.Click.AddHandler myEventHandler Alt+^ カーソル行の 1行を F#interactive に送る GUIデザイナー じゃ できません!!
  13. イベントの削除もできる// イベントハンドラの削除button.Click.RemoveHandler MyEventHandler Alt+Enter 返事がなくなった・・ ただの屍ボタン のようだ・・
  14. 簡略化されたイベントの追加方法// イベントの追加button.Click.Add (fun _ -> msg "20万円ぐらいあります。")button.Click.Add (fun _ -> msg "またのご来店を!") 範囲選択 Alt+Enter F#のみにある object senderにあたる引数が省略されている EventArgsに全てのイベント引数が格納されている
  15. WindowにCanvasを配置// Canvasを作成let Mr = new Canvas()// WindowにCanvasを追加 範囲選択 Alt+Enterwindow.Content <- Mr
  16. 適当に位置決め関数を作る・・// Canvas上での位置を得るlet getButtonPos(o:UIElement) = new Point( Canvas.GetLeft o, Canvas.GetTop o )// Canvas上での位置をセットlet setButtonPos (o:UIElement) (p:Point) = Canvas.SetLeft(o,p.X) Canvas.SetTop(o,p.Y))
  17. Canvasにボタンを配置// Canvasを作成let Mr = new Canvas()// WindowにCanvasを追加window.Content <- Mr// ボタンをCanvasに追加Mr.Children.Add button 範囲選択 Alt+Enter// 位置決め関数でボタンをSetsetButtonPos button 範囲選択 (new Point(10.,10.)) Alt+Enter
  18. コントロールをドラッグ可能にする関数 を作って・・// Canvas上を移動できるようにするlet enableDragMove (c:Button) = let offset = ref None c.MouseEnter.Add(fun e -> offset := Some(getButtonPos c - e.GetPosition(Mr))) c.MouseLeave.Add(fun _ -> offset := None); c.MouseMove.Add(fun e -> if (!offset).IsSome then let p = e.GetPosition(Mr) + (!offset).Value setButtonPos c p )
  19. コントロールの直接操作が実現 マウスでドラッグ マウスでドラッグ マウスでドラッグコントロールを直接操作して、外観を決定できるイベントなので、この機能は追加・削除しながら使える
  20. 同様に、ボタンをリサイズ// コントロールをリサイズ出来るようにするlet enableDragResize (c:Button) = ..被るので省略 Alt+Enter
  21. 現在のGUIからプロパティ値を得る GUIにプロパティ値を設定する方法は簡単だった GUIからプロパティ値を吸い出すのも簡単 printfn "%s <- %f" "button.Width" button.Width printfn "%s <- %f" "button.Height" button.Height範囲選択Alt+Enter F#interactiveに ボタンのプロパティ値が表示された
  22. 第1章:スクリプティングまとめコンパイルなしコンパイル時間なし無駄な手順なく、修正の繰り返しGUIデザイナーで出来ないことも、出来る少しのコードで、色々な方法が実現
  23. 第2章:OOPなぜF#でOOPは必要か?型拡張フレキシブル型関数プログラミングとOOPの関係
  24. // ウィンドウ直下にボタンを追加。(C#っぽく書くとこうなる・・)let stackpanel = new StackPanel()stackpanel.Orientation <- Orientation.Horizontalfor lang in ["Haskell";"OCaml";"Scala";"F#";"Clojure";"SML"] do let checkbox = new CheckBox() checkbox.Content <- lang checkbox.Margin <- new Thickness(5.) stackpanel.Children.Add checkbox |> ignorelet groupbox = new GroupBox()stackpanel.Orientation <- Orientation.Horizontalgroupbox.Header <- "函數型言語" こんなの書いてると、groupbox.Content <- stackpanel 抜け毛が増えるお!!groupbox.Margin <- new Thickness(10.)window.Content <- groupbox
  25. // ウィンドウ直下にボタンを追加。(F#っぽく書ける!)let stackpanel = StackPanel.HorizontalPanelfor lang in ["Haskell";"OCaml";"Scala";"F#";"Clojure";"SML"] do CheckBox() |> content(Label(Content=lang)) |> margin 5 |> stackpanel.Appendlet groupbox = GroupBox() |> header "函數型言語" パイプライン演算子で書くと、 断然分かりやすい!! |> content stackpanel 簡潔!! |> margin 10 |> window.Append
  26. type StackPanel with 型拡張の例 // インスタンスメソッド member this.Append o = ポリモーフィズム this.Children.Add o |> ignore // 静的メソッド static member HorizontalPanel = let panel = new StackPanel() panel.Orientation <- Orientation.Horizontal paneltype ContentControl with member this.Append o = this.Content <- o
  27. 型拡張の効力新しい型を作らず、既存の型に機能追加 継承より手軽 パーシャルクラスより後付けしやすい静的メソッドも、メンバメソッドも追加できる 拡張メソッドより多機能OOPでポリモーフィズムを獲得する一例 カリー化関数より、ポリモーフィズムを獲得しやすい 型推論には、やや相性が悪い
  28. // contentを追加 フレキシブル型let content c (o:#ContentControl) = o.Content <- c o// marginを指定let margin x (o:#FrameworkElement) = o.Margin <- new Thickness(float x) o// ヘッダ要素を追加let header c (o:#HeaderedContentControl) = o.Header <- c 条件を満たしていれば、 o 型変換せずに代入できる引数
  29. フレキシブル型の効力条件を満たす型なら、そのまま渡せる 引数をベースクラスやインターフェースにキャストしなくていい 元の型に戻したい時に、ダウンキャストしなくていい型制約 ^T when ^T :> BaseType と比べて structural-subtypingによる、型推論の困難さがない 短いw
  30. 関数プログラミングとOOPの関係本日の最重要トピックF#コンポーネント設計ガイドライン(2010年8月) Microsoftリサーチ、Microsoft開発部よるドキュメント F#は関数型言語ではなくマルチパラダイム言語 複数パラダイムを組み合わせると、特に効果を発揮する FPとOOPは相反するものだと一般に誤解されている FPとOOPは直交するものであり、相補的なものである 上記引用のURL : http://goo.gl/OAw2Y
  31. // ウィンドウ直下にボタンを追加。(F#っぽく書ける!)let stackpanel = StackPanel.HorizontalPanelfor lang in ["Haskell";"OCaml";"Scala";"F#";"Clojure";"SML"] do CheckBox() |> content(Label(Content=lang)) |> margin 5 |> stackpanel.Appendlet groupbox = GroupBox() このコードは、 |> header "函數型言語" 関数プログラミングと、 オブジェクト指向があって、 |> content stackpanel はじめて書けるな・・ |> margin 10 |> window.Append
  32. 第2章:OOPまとめOOPにより、さらにコードが簡潔になる型拡張は便利フレキシブル型は便利FPとOOPを組み合わせよう、両者は相補的である
  33. 第3章:副作用製作例:99行でマインスイーパーlet束縛で、変数の参照だけでも固定していれば・・ 変数の表すオブジェクトは常に同じ。参照透明に近い。 中身が副作用を伴っても、外側のコードに影響は少な い。事前計算 をする 必要な値がimmutableとなり、コードから副作用が消え る コード上では、遅延評価に似た、簡潔なコードを生む 本当に遅延評価が欲しかったら lazy があるおmutableなデータ構造も使う immutableなデータ構造を引き回しは大変な時もある そういう時は、手続き型+副作用有りのコードを書く
  34. 製作例:99行でマインスイー パー 有効行99行 設計レベルでいくつか のショートコーディング テクニックを使用 読みやすさは普通 3回リファクタリングし たので、労力は掛かっ ている 詳しくはソースコード ( fssnip.net/7W)を見て 下さい
  35. コードが短くなる原理は、 状態の局所化! ソースコードの内訳 インポート宣言 ワーニングの抑制 ヘルパー関数 状態を表す判別共用体 型定義 (UI 要素を表す型 ) 展開する範囲を求める関数変数宣言 (UI のレイアウトを決める ) 状態変化なし 初期化関数 メイン関数 イベントハンドラ関数 状態変化あり 0 5 10 15 20 25 30
  36. 第3章:副作用まとめ純粋関数が無くても、参照透明性は十分確保できる遅延評価には、代替手段がある副作用やmutableなデータ構造はとても役に立つ
  37. Thank You For Your For  Listening !!By ながとタン

×