アレイの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以外にとっては)直感的ではない名前です。