取り合えず書いてみた

昨日にしろ今日にしろ、関数型が云々偉そうな事を言っていますが、実は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の方が大分早かったですね。これが遅延評価というやつなんですかね。コンパイルすると、比較にならないほど早くなったのは言わずもがな。