アレイのuniq

エロと風俗情報満載 どう抜く?ってHaskellだったらnubだなぁと思って、GHCのソースを見てみるとふたつ実装がありました。
まずひとつ目。USE_REPORT_PRELUDEが定義されているときはこちらを使っているみたいです。

nub                     :: (Eq a) => [a] -> [a]
nub                     =  nubBy (==)

nubBy			:: (a -> a -> Bool) -> [a] -> [a]
nubBy eq []             =  []
nubBy eq (x:xs)         =  x : nubBy eq (filter (\ y -> not (eq x y)) xs)

ふたつ目。ふむ。こっちの方がリストのコピーが少なくてすみそうです。

nub                     :: (Eq a) => [a] -> [a]
-- stolen from HBC
nub l                   = nub' l []		-- '
  where
    nub' [] _		= []			-- '
    nub' (x:xs) ls				-- '
	| x `elem` ls   = nub' xs ls		-- '
	| otherwise     = x : nub' xs (x:ls)	-- '

ついでに。nubって`essence'みたいな意味だったのですね。コメントに書いてありました。これまた(native以外にとっては)直感的ではない名前です。