C# 3.0
ちょっとはやっとかないと。
selectはmapだと思ってたらlambda式が呼ばれない。
あれー・・・。
・・・遅延評価されんのか。
面白いといえば面白い。しかしなぁ・・・。
CにOOPにして、テンプレートも入れて・・・、「はっくはたのしいけどそれでいいのか?(棒読み)」見たいなC++のような香りが。
Java型のOOPに関数型ひっつけてみましたって感じがあるなぁ。
いつか、C++からJavaになってOOPの裾野が広がったみたいに、C#が後付でひっつけた関数型(というか宣言型)っぽい部分をうまく取り込んで咀嚼した言語が出てくるのかな。
書いてて思ったこと。
・returnって書くの面倒
・戻り値voidのメソッドはなくしてとりあえずnullでも返しといて
・でも思ってたよりも面白い
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var array0 = new[]{"aaa","bbb","ccc","ddd"}; var test0 = from a in array0 where a == "bbb" || a == "ccc" select a; var test1 = array0.Where(a => a == "bbb" || a == "ccc").Select(a => a); //型推論できずにエラー //test0.Select(a => Console.WriteLine(a)); //whereの挙動がみたい var array1 = array0.Where(a => { Console.WriteLine("where\t" + a); return a == "bbb" || a == "ccc"; }); //ここではlambda式が呼ばれてない //selectの挙動が見たい var test2 = array1.Select(a => { Console.WriteLine("select\t" + a); return a; }); //ここでもlambda式が呼ばれてない string dummy; //遅延評価されるからここで呼ばれる foreach (string s in test2) { dummy = s; } //たしかにreduceだ。 var test3 = array0.Aggregate(new List<string>(), (lst, s) => { Console.WriteLine(lst.ToString()); lst.Add(s); return lst; }); //これはダメ 型推論できないみたい。理由はよく理解できない。 //var f0 = a => //{ // Console.WriteLine(a); // return a + 1; //}; //こっちはOK Func<int, int> f1 = a => { Console.WriteLine(a); return a + 1; }; Console.WriteLine(f1(10)); Console.ReadLine(); } } }