そもそも「ただの静的型付け言語」ってなんだろう?

この件、もう少し考えてみて、何が起こっているのかやっと理解できたような気がします。

この話って要するに

C#3.0は「型を明示しない静的型付け言語」になりました!

という派閥と、

C#も(C++0xと同様に)「場合によっては型の明示を省略できるただの静的型付け言語」のままである! という派閥の対立なんじゃないでしょうか。

前者から見れば「可能な限りvarを使って何を不自由するの?」ということになるし、後者から見れば「なんで型を書いちゃだめなの?」という話になる。

こうですか!? わかりません><

import Control.Monad.List

solve = do baker <- [1, 2, 3, 4, 5]
           cooper <- [1, 2, 3, 4, 5]
           fletcher <- [1, 2, 3, 4, 5]
           miller <- [1, 2, 3, 4, 5]
           smith <- [1, 2, 3, 4, 5]
           guard $ distinct [baker, cooper, fletcher, miller, smith]
           guard $ baker /= 5
           guard $ cooper /= 1
           guard $ fletcher /= 1 && fletcher /= 5
           guard $ miller > cooper
           guard $ abs (smith - fletcher) /= 1
           guard $ abs (fletcher - cooper) /= 1
           [baker, cooper, fletcher, miller, smith]

distinct :: Eq a => [a] -> Bool
distinct [] = True
distinct (x:xs) = all (/=x) xs && distinct xs

main :: IO()
main = print solve

あ,言語間違ってた.
こうですか!? わかりません><

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var answers =
            from baker in Enumerable.Range(1, 5)
            from cooper in Enumerable.Range(1, 5)
            from fletcher in Enumerable.Range(1, 5)
            from miller in Enumerable.Range(1, 5)
            from smith in Enumerable.Range(1, 5)
            where new []{ baker, cooper, fletcher, miller, smith }.Distinct().Count() == 5
            where baker != 5
            where cooper != 1
            where fletcher != 1 && fletcher != 5
            where miller > cooper
            where Math.Abs(checked(smith - fletcher)) != 1
            where Math.Abs(checked(fletcher - cooper)) != 1
            select new { baker, cooper, fletcher, miller, smith };

        foreach (var answer in answers)
            Console.WriteLine(answer);
    }
}

うーむ,void が消せない……