何について約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
です。
@WillNess Nah、あなたがトラバースを終えた後に入力リストに残っているものがあるかどうかを確認するだけです。コードを更新します –
@WillNess Traversableを埋めるのに十分な項目がリストにない場合、質問者は 'Nothing'を返そうと思っています。考え方は、入力値をトラバース可能な形に保ちながら、それぞれの値をペアにして、 –
ああ、これは理にかなっています。これはあなたの以前のバージョンが本当に正しいことを意味します。 :)私は以前のバージョンを復元し、明確な例を追加しました。これは申し訳ありません。 –