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();
        }
    }
}