SlideShare ist ein Scribd-Unternehmen logo
1 von 35
More C# λ
自己紹介 ,[object Object],[object Object]
C# における λ 式 Func<int, int> f = (x => x * x);
C#3.0 – lambda expression ,[object Object],Func< string > f1 = () => “hello, world”; Func< int ,  int > f2 = ( int  x) => x + 1; Func< int ,  string > f3 = x => (x<=5 ? “foo” : “bar”); Func< int ,  int ,  int > f4 = (x, y) => x * y; Func< string ,  int > f5 = x => { int  length = x.Length; return  length; }; System.Action nop = () => {};
意外と嬉しい コレクション初期化子 var lst = new List{ 1, 2, 4, 8 };
C#3.0 – Collection Initializers ,[object Object],List<Employee> lst =  new  List<Employee>(); Employee john =  new  Employee(); john.Name = &quot;john&quot;; john.Age = 58; Employee michael =  new  Employee(); michael.Name = &quot;taro&quot;; michael.Age = 62; lst.Add( john ); lst.Add( michael );
C#3.0 – Collection Initializers ,[object Object],var  lst =  new  List<Employee>() { new  Employee { Name = &quot;john&quot;, Age = 22 }, new  Employee { Name = &quot;taro&quot;, Age = 24 }, };
C#3.0 – Collection Initializers ,[object Object],public class  Foo { Dictionary< string , int > dic =  new  Dictionary< string , int >{ { &quot;one&quot;, 1 }, { &quot;two&quot;, 2 }, { &quot;three&quot;, 3 } }; /*public Foo() { this.dic.Add( &quot;one&quot;, 1 ); this.dic.Add( &quot;two&quot;, 2 ); this.dic.Add( &quot;three&quot;, 3 ); }*/ }
型パラメータによって 振る舞いを変える Foo<ClassA>.Method( x ); Foo<ClassB>.Method( x );
Generics ,[object Object],[object Object],[object Object]
1 .  静的フィールドの利用 ,[object Object],class  Foo<T> {  public static int  Value; } ~ Foo< int >.Value = 99; Foo< string >.Value++; Console.WriteLine( Foo< int >.Value ); Console.WriteLine( Foo< string >.Value ); 99 1
Demonstration 型パラメータによって振る舞いを変える -  静的フィールド利用編  -
型パラメータの判別 ,[object Object],[object Object],[object Object]
2 .  拡張メソッドを使った場合 ,[object Object],[object Object],[object Object],public  static  class  SampleExtensions { public  static  int  Add(  this  int  a,  int  b ) { return  a + b; } } ~ int  a = 60; int  result = a.Add( 40 );  // 100
2 .  拡張メソッドを使った場合 public class  Foo<T> { } public static class  FooExtensions { public static void  Method(  this  Foo< string > f,  int  x ) { Console.WriteLine( x + &quot; かもしれない &quot; ); } public static void  Method(  this  Foo< int > f,  int  x ) { Console.WriteLine( x + &quot; じゃないと思う &quot; ); } public static void  Method<T>(  this  Foo<T> f,  int  x ) { Console.WriteLine( x ); } } つづく
2 .  拡張メソッドを使った場合 public void  Test() { new  Foo< string >().Method( 10 ); new  Foo< int >().Method( 100 ); new  Foo<Foo< string >>().Method( 1000 ); } 10 かもしれない 100 だと思う 1000
2 .  拡張メソッドを使った場合 ,[object Object],[object Object],[object Object],var  f =  new  Foo< string >(); Action< int > curry = f.Method; curry( 10 );  // 10 かもしれない
C# における クロージャのからくり x => y => x * y;
函数は ファーストクラスオブジェクト f = Console.WriteLine;
ファーストクラスオブジェクト? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
実用例~関数の足し算 public  Func< string > GetFunc() { string  data = &quot;hello&quot;; Func< string > fns = null; fns += (() => data += &quot; world&quot;); fns += (() => data = data.ToUpper()); fns += (() => data = &quot;<b>&quot;+data+&quot;</b>&quot;); return  fns; } ~ var  f =  this .GetFunc(); Console.WriteLine( f() );  // <b>HELLO WORLD</b> “ 責任”を動的に組み替えられる ⇒ ミニマムな Decorator パターン
実用例2~ switch の除去 public abstract class  Food { } public class   ちくわ  : Food { } public class   ネオちくわ  :  ちくわ  { } public class   いも  : Food { } public class   じゃがいも  :  いも  { } public class   みそしる  : Food { } ~ public  Food Create(  string  name ) { switch  ( name ) { case  &quot;taro&quot;:  return   new   ネオちくわ (); case  &quot;hanako&quot;:  return new   いも (); case  &quot;mae&quot;:  return new   みそしる (); default :  throw new  ArgumentException(); } } Before…
実用例2~ switch の除去 private  Dictionary< string , Func< Food >> table = new  Dictionary< string , Func< Food >>() { { &quot;taro&quot;, () =>  new   ネオちくわ () }, { &quot;hanako&quot;, () =>  new   いも () }, { &quot;mae&quot;, () =>  new   みそしる () } }; public  Food Create(  string  name ) { if (  this .table.ContainsKey( name ) ) return   this .table[ name ](); throw new  ArgumentException(); } After !
高階関数をもう少し (sort '((one . 1) (two . 2) (three . 3)) #'> :key #'cdr)
高階関数 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
高階関数~メモ化 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
高階関数~メモ化 ,[object Object],public Func<T, TResult> Memoize<T, TResult>( Func<T, TResult> fn ) { var  dic =  new  Dictionary<T, TResult>(); return  x => { if  ( ! dic.ContainsKey( x ) ) dic.Add( x, fn( x ) ); return  dic[ x ]; }; } 関数  +  環境 ⇒ クロージャ ( Closure )
Demonstration メタボ関数を軽くする -  メモ化  -
ちょっとマイナーな 標準クエリ演算子 SelectMany. ToLookup. OfType.
Demonstration いくつかクエリを - LINQ -
質問タイム \ ( ^ o ^ ) /
まとめ
まとめ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
最後に Demonstration.
ご清聴どうもありがとうございました。 Nobuhisa Koizumi.

Weitere ähnliche Inhalte

Was ist angesagt?

モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!Kenta Sato
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールNobuhisa Koizumi
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPIDaisuke Igarashi
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lensNaoki Aoyama
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話Moriyoshi Koizumi
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCamlHaruka Oikawa
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」Nagi Teramo
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへNaoki Kitora
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020Fujio Kojima
 
Java8 Lambda chapter5
Java8 Lambda chapter5Java8 Lambda chapter5
Java8 Lambda chapter5Takinami Kei
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会Takinami Kei
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜勝成 鈴江
 
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014Takashi J OZAKI
 
Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Atsuo Ishimoto
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体digitalghost
 

Was ist angesagt? (20)

モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lens
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
Map
MapMap
Map
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
 
初めてのSTL
初めてのSTL初めてのSTL
初めてのSTL
 
Mock and patch
Mock and patchMock and patch
Mock and patch
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
 
Java8 Lambda chapter5
Java8 Lambda chapter5Java8 Lambda chapter5
Java8 Lambda chapter5
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
 

Ähnlich wie CLR/H No.35-2

T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日Go Tanaka
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICLyak1ex
 
Ext.Directについて
Ext.DirectについてExt.Directについて
Ext.DirectについてYuki Naotori
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programmingtakesako
 
Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshTomofumi Hayashi
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Toshio Ehara
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~Fujio Kojima
 
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)Cryolite
 
XLWrapについてのご紹介
XLWrapについてのご紹介XLWrapについてのご紹介
XLWrapについてのご紹介Ohsawa Goodfellow
 
webを飾る技術
webを飾る技術webを飾る技術
webを飾る技術ina job
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoShoot Morii
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューAkira Inoue
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)Cryolite
 

Ähnlich wie CLR/H No.35-2 (20)

T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
Ext.Directについて
Ext.DirectについてExt.Directについて
Ext.Directについて
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
 
Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axsh
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
 
XLWrapについてのご紹介
XLWrapについてのご紹介XLWrapについてのご紹介
XLWrapについてのご紹介
 
webを飾る技術
webを飾る技術webを飾る技術
webを飾る技術
 
Boost tour 1_44_0
Boost tour 1_44_0Boost tour 1_44_0
Boost tour 1_44_0
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)
 

CLR/H No.35-2