取り合えず書いてみた
昨日にしろ今日にしろ、関数型が云々偉そうな事を言っていますが、実はSICPを半分くらい読んだだけ、程度の経験しかありません。そういうところがダメなんだと、この日記を始めたところに繋がってくるわけで、早速Haskellを書いてみました。リストに重複があるかどうかを判定するだけのプログラム・・・。
duplicate [] = False duplicate (x:xs) = if include x xs then True else duplicate xs include x [] = False include x (y:xs) = if cond x y then True else include x xs cond x y = x == y main = do print $ duplicate ([1..10000] ++ [9999])
なんかもっと綺麗というか、エレガントに書けそうだけど、今の実力ではこれが限界、というか、これでもかなり頭使った。再帰難しいですね。修行が必要。
ちなみに、foreachのネストでperlで書いてみたんですが、
use strict; sub duplicate { foreach my $i (0..(@_-2)) { foreach my $j (($i+1)..(@_-1)) { return 1 if ($_[$i] eq $_[$j]) } } return 0; } print duplicate(1..10000, 9999);
ghciの方が大分早かったですね。これが遅延評価というやつなんですかね。コンパイルすると、比較にならないほど早くなったのは言わずもがな。