F# と C# で見る関数志向プロ
        グラミング

      目的
 F#とC#で同じこと
  をやってみよう
変数いろいろ
let n = 1 // 数値リテラル                         var n = 1; // 数値リテラル

let s = "123" // 文字列リテラル                    var s...
関数(メソッド)いろいろ
// 普通の                                       // 普通の
let func x = x + 10                          static int F...
ライブラリの高階関数
// 要素番号と要素を列挙する                                    // 要素番号と要素を列挙する
Seq.iteri (printfn "%d:%d") [1..10]         ...
関数を返す高階関数
// メモイズ                                     // メモイズ
let m oize func =
      em                                  ...
まとめ

F# と C# で同じことはできるの
        か?
        ↓
 できる!がんばればっ!
関数を整理してみる

         model                            type
         action                        unit -> unit
  comparison...
高階関数って結局何ができ
     る?
「処理」と「制御」と「構造」を
  簡単 に分離できる
      ↓

  IoC パターンの促進
みなさんの引き出しの中に
  関数型言語を!!
ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

F#とC#で見る関数志向プログラミング

2,759 views
2,691 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,759
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
12
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

F#とC#で見る関数志向プログラミング

  1. 1. F# と C# で見る関数志向プロ グラミング 目的 F#とC#で同じこと をやってみよう
  2. 2. 変数いろいろ let n = 1 // 数値リテラル var n = 1; // 数値リテラル let s = "123" // 文字列リテラル var s = "123"; // 文字列リテラル let li = [ 1; 2; 3; 4; 5] // リストリテラル // リストリテラル? var li = new List<int> { 1, 2, 3, 4, 5 }; // list comprehension let li2 = // リスト内包表記...?   [ for x in 1..20 do var li2 =     if x % 2 = 0 then Enum erable.Range(1, 20)      yield x ] .W here(x => x % 2 == 0).ToList(); // Sequence = Enum elable<T> // もうLinqで let sq = var sq =  seq { for x in 1..10 - > x, x*x, x*x*x } from x in Enumerable.Range(1, 10) select new { X=x, XX=x*x, XXX=x*x*x };
  3. 3. 関数(メソッド)いろいろ // 普通の // 普通の let func x = x + 10 static int Func(int x) { return x + 10; } // 繰り返し // 繰り返し let factorial n = static int Factorial(int n) { let rec loop accum n = var result = 1; if n < 1 then accum for (int i = 1; i <= n; i++) else loop (accum * n) (n - 1) result *= i; loop 1 n return result; } // 高階関数 let rec fold proc init li = // 高階関数 m atch li w ith static TResult Fold<TSource, TResult>( | [] - > init Func<TResult, TSource, TResult> proc, | x::xs - > fold proc (proc init x) xs TResult init, List<TSource> li) { foreach (TSource e in li) init = proc(init, e); return init; }
  4. 4. ライブラリの高階関数 // 要素番号と要素を列挙する // 要素番号と要素を列挙する Seq.iteri (printfn "%d:%d") [1..10] var index = 0; foreach (var x in Enum erable.Range(1, // 要素に関数を適用した結果をSeqにして返す 10).Select( x => new { i=index++, x=x })) let a = Seq.m (fun x - > x * x) [1..10] ap Console.W riteLine(x.ToString()); // 条件を満たす要素のみのSeqを返す // 要素に関数を適用した結果をEnum rable<T>に let b = Seq.filter (fun x - > x % 2 = 0) [1..10] して返す var a = from x in Enumerable.Range(1, 10) // グルーピング select x * x; let c = Seq.groupBy (fun x - > x % 3) [1..20] // 条件を満たす要素のみのSeqを返す var b = from x in Enumerable.Range(1, 10) where x % 2 == 0 select x; // グルーピング var c = Enum erable.Range(1, 20).GroupBy(x => x % 3);
  5. 5. 関数を返す高階関数 // メモイズ // メモイズ let m oize func = em static Func<T, TResult> M oize<T, em let cach = ref M ap.em pty TResult>(Func<T, TResult> func) fun n - > { m atch M ap.tryFind n !cach with var cach = new Dictionary<T, TResult>(); | Som v - > v e return (T n) => { | None - > var v = default(TResult); let tem = func n p if (cach.TryGetValue(n, out v)) cach := M ap.add n tem !cach p return v; tem p else { var tem = func(n); p cach.Add(n, temp); return temp; } }; }
  6. 6. まとめ F# と C# で同じことはできるの か? ↓ できる!がんばればっ!
  7. 7. 関数を整理してみる model type action unit -> unit comparison function Type -> Type -> int callback Type -> unit delayed computation unit -> Type transformer Type1 -> Type2 sink Type -> unit visitor accumulating function Type1 -> Type2 -> Type2
  8. 8. 高階関数って結局何ができ る? 「処理」と「制御」と「構造」を 簡単 に分離できる ↓ IoC パターンの促進
  9. 9. みなさんの引き出しの中に 関数型言語を!!
  10. 10. ご清聴ありがとうございました

×