GHCでUNIQ

一つ違いzipによるuniq

まあ、昨日のscheme版の焼き直し。haskellの方が読みやすいが数字しかuniq出来ない
あと、メタな記号が入れられないので(今回は1000でごまかした)いまいち。

Prelude> (\x->reverse $ drop 1 $ reverse $fst $ unzip $ filter (\x->(fst x)/=(snd x)) $ zip (x++[1000]) ([1000]++x)) [1,1,2,2,3,3,3,2,2,4]
[1,2,3,2,4]

追記:Maybeモナドを使う場面だそうです。

Prelude Maybe> (\x->catMaybes$fst$unzip$filter (\x->fst x/=snd x)$zip ((map Just x)++[Nothing]) ([Nothing]++(map Just x))) [1,1,2,2,3,3,3,3,2,2,4]
[1,2,3,2,4]

ちょっと忘れてるのでもう少し書いておく

Prelude List> :m Maybe
Prelude Maybe> map Just [1,2,3]
[Just 1,Just 2,Just 3]
Prelude Maybe> catMaybes $ map Just [1,2,3]
[1,2,3]

Justとか最初の勉強以来だ catMaybesもあんまつかわんし。
でもこれのおかげで Nothing->"" ってのがかっこいい、まるで虚数のようだ

foldrを使ったuniq

やっぱ引数の処理はhaskellがかっこいいな。有無を言わさずカリー化(?)されるのはすごい。schemeだともう一つlambdaが必要だもんな。
まあ、haskellの場合 foo=がdefine foo (lambda (x) まで担当してるんだろうな。

Prelude> let uniq =  foldr (\x y->if y==[]||x/=(head y) then [x]++y else y) [] 
Prelude> uniq [1,1,2,2,3,3,3,2,4,4]                                                                
[1,2,3,2,4]

groupを用いたuniq

コメントでおしえてもらったやつ。数字だけじゃないところがいい。
これは以前知っていたような気がするんだがgroupの存在を完全に忘れてました。

Prelude Maybe> :m List
Prelude List> let uniq1 xs = map head $ group xs
Prelude List> uniq1 ["b","c","a","a","d","c"]
["b","c","a","d","c"]
Prelude List> uniq1 [1,2,2,3,3,3,2,4,4]
[1,2,3,2,4]