2017-01-07 11 views
5

Traversableは、その構造が "パス"(リストに対応することができる)を持つコンテナのクラスであり、その要素はその構造を解消することなく変更することができる。したがって、リスト状態のトラバーサルは少しハックしている可能性が高く、効率的な方法ではないようです。私は上記のまたはより一般的なタスクを達成する標準的な機能があると思いますが、私はそれが何であるかを理解できません。トラバーサブルをリストで圧縮する最も標準的な/一般的な方法は何ですか?

答えて

5

何について約mapAccumL/mapAccumR?効率の問題について

tzipWith :: Traversable t => (a -> b -> c) -> [a] -> t b -> Maybe (t c) 
tzipWith f xs = sequenceA . snd . mapAccumL pair xs 
    where pair [] y = ([], Nothing) 
      pair (x:xs) y = (xs, Just (f x y)) 

tzip :: Traversable t => [a] -> t b -> Maybe (t (a, b)) 
tzip = tzipWith (,) 

ghci> tzip [1..] [4,5,6] 
Just [(1,4),(2,5),(3,6)] 

ghci> tzip [1,2] [4,5,6] 
Nothing 

からunder the hoodmapAccum関数は状態モナドを使用するので、私は本当にやったすべてが、高階関数でコードの不可欠の部分をキャプチャです。私はこのコードがあなたよりも優れた性能を発揮するとは思わないでしょう。しかし、私はあなたがStateモナド(またはST)よりもはるかにうまくいくとは思えません。与えられたのはTraversable tです。

+0

@WillNess Nah、あなたがトラバースを終えた後に入力リストに残っているものがあるかどうかを確認するだけです。コードを更新します –

+0

@WillNess Traversableを埋めるのに十分な項目がリストにない場合、質問者は 'Nothing'を返そうと思っています。考え方は、入力値をトラバース可能な形に保ちながら、それぞれの値をペアにして、 –

+0

ああ、これは理にかなっています。これはあなたの以前のバージョンが本当に正しいことを意味します。 :)私は以前のバージョンを復元し、明確な例を追加しました。これは申し訳ありません。 –

関連する問題