関数型言語初心者の俺がF#触ってみた

1,232 views

Published on

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

No Downloads
Views
Total views
1,232
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
4
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

関数型言語初心者の俺がF#触ってみた

  1. 1. 関数型言語初心者がF#触ってみた @245X
  2. 2. F#とは 関数型言語(純粋ではない) .NET Frameworkとの互換性が高い Ocamlの機能を多く受け継いでいる
  3. 3. F#を使うメリット .NET Frameworkで使える Visual Studioで開発できる 美しいコードが書ける
  4. 4. F# Interactive  F#を実行できるインタプリタ  Visual Studio 2010以降についてる  Alt+Enterで範囲指定したF#のコードをインタ プリタに渡せて便利
  5. 5. 変数 letで宣言できる。 基本的に値は変更できない。 代入することを「束縛」という。> let a = 1;;val a : int = 1> a <- 2;; // <- は代入の演算子 a <- 2;; ^^^^^^stdin(7,1): error FS0027: この値は変更可能ではありません
  6. 6. 値が変更できないメリット 状態に依存しなくなる。 →バグを抑えることができる。 いつでも必ず同じ結果が返ってくる。 →再利用しやすい。 アルゴリズムが明確になる。 →リーダブルコード!
  7. 7. 純粋な関数 funをつけることで関数を宣言。 ラムダ計算においては、関数の引数は常に1つ 関数定義:fun x -> x + 1 ;; 関数適用:x 1;;> let myFun = fun x -> x * x;;val myFun : x:int -> int> myFun 3;;val it : int = 9
  8. 8. 2つ以上の引数を渡すには? 関数の引数に関数を渡せばよい> let f = (fun x -> (fun y -> x + y));;val f : x:int -> y:int -> int> f 10;;val it : (int -> int) = <fun:it@2>> f 10 20;;val it : int = 30
  9. 9. 省略形let f = (fun x -> (fun y -> (fun z -> x + y + z)));;let f = fun x y z -> x + y + z;;let f x y z = x + y + z;; どれも同じ関数である。
  10. 10. パターンマッチ お馴染みのFizzBuzz if文で書いてみると以下のようになる。let FizzBuzz1 num = if num % 3 = 0 && num % 5 = 0 then "FizzBuzz" elif num % 3 = 0 then "Fizz" elif num % 5 = 0 then "Buzz" else string num
  11. 11. これをパターンマッチで書くと…?let FizzBuzz2 num = match num with | x when x%3 = 0 && x%5 = 0 -> "FizzBuzz" | x when x%3 = 0 -> "Fizz" | x when x%5 = 0 -> "Buzz" |_ -> string num// アンダーバー(_)はワイルドカード  スッキリした形で記述できる。
  12. 12. タプルを使うと更にスッキリするlet FizzBuzz3 num = match (num%3, num%5) with |(0, 0) -> "FizzBuzz" |(0, _) -> "Fizz" |(_, 0) -> "Buzz" |_ -> string x
  13. 13. パターンマッチの魅力 すべてのパターンに到達可能かどうか、またすべての パターンを網羅しているかを事前に警告してくれる。> let FizzBuzz3 x = match (x%3, x%5) with |(0, 0) -> "FizzBuzz" |(0, _) -> "Fizz" |(_, 0) -> “Buzz“FizzBuzz.fs(18,16): warning FS0025: この式のパターン マッチが不完全です たとえば、値 (1,1) はパターンに含まれないケースを示す可能性があります。val fb : x:int -> string
  14. 14. 関数型言語は奥が深い・・・
  15. 15. ところで
  16. 16. F#はWindowsPhone 開発もサポートして いるとか
  17. 17. 手順 Visual Studio 2010 Professionalをインストール →プロジェクトのテンプレートが2010のみ対応のため Visual Studio 2010 Service Pack 1 をインストール http://www.microsoft.com/ja-jp/download/details.aspx?id=23691 Microsoft Silverlight 4 Tools for Visual Studio 2010 をインストール http://www.microsoft.com/ja-jp/download/details.aspx?id=18149 Windows Phone SDK 7.1 と SDK7.1.1更新プログラムをインストール http://www.microsoft.com/ja-jp/download/details.aspx?id=27570 http://www.microsoft.com/ja-jp/download/details.aspx?id=29233 開発テンプレート F# and C# Win Phone App (Silverlight) をインストール http://visualstudiogallery.msdn.microsoft.com/17454c58-c1d9-4640-afe1-7943db13891e/
  18. 18. 手順  ファイル→新規作成→プロジェクト  Visual F#→WP7→F# and C# Windows Phone Application (Silverlight)を選択  作成して実行してみる
  19. 19. ここで問題発生 以下のようなエラーが出る F# runtime for Silverlight version v4.0 is not installed. Please go to http://go.microsoft.com/fwlink/?LinkId=177463 to download and install matching F# runtime F# for Silverlight Runtime がインストールされていない Microsoft Silverlight 4 Tools for Visual Studio 2010 に含ま れてるはずなのに・・・
  20. 20. 仕方ないので Microsoft Silverlight 4 Tools for Visual Studio 2010 の 実行ファイルからF# for Silverlight Runtime のインス トーラを取り出して実行 Explzhを使って取り出した http://www.ponsoftware.com/ FSharpRuntimeSL4.msi を実行
  21. 21. 実行できた
  22. 22. 構成 AppとAppHostに分かれる App.xaml、App.xaml.csは通 常と同じ MainPage.xamlにビュー AppLogic.fsにロジック
  23. 23. 書きやすい? 正直まだ分からん 複雑なロジックを簡潔に記述できるかもしれない F#のサポートが弱いのがつらい → テンプレートがVS2010のみ対応だし、ストアア プリはできなさそう ライブラリ作って呼び出すのは可能なはず
  24. 24. そのうちHaskellも 勉強します

×