そもそも「ただの静的型付け言語」ってなんだろう?
この件、もう少し考えてみて、何が起こっているのかやっと理解できたような気がします。
この話って要するに
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 が消せない……