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]