はHaskellでは、我々はそれにそのインデックス付き要素のリストから取得するには、この便利なイディオムを使用することができます。Haskell:foldr/build fusionを(zip [0 ..])で作成するには?
indexify :: (Num i) => [a] -> [(i,a)]
indexify = zip [0..]
しかし、GHC.List
as of base-4.9.1.0
でzip
の実装によると、これは完全にリスト融合、すなわちを実行しません実際にはリスト[0 ..]は生成されませんが、引数リストはindexify
になります。もちろん
、適切なリストの融合を可能にする定義があります:
indexify' :: (Num i) => [a] -> [(i,a)]
indexify' xs = build $ \c n ->
foldr (\x r !i -> (i,x) `c` r (i+1)) (const n) xs 0
は、我々はこれを行うにはimport GHC.Prim (build)
する必要がありますか?または、indexify'
に単純化する別の実装がありますか?
'' indexit = sndのf!i x =(i + 1、(i、x))としますか? mapAccumL f 0'は動作しますか?私は 'mapAccumL'は融合の対象だと信じています。 – Alec
@Alecあなたのコメントを答えに変えて受け入れようとしていたが、それはうまくいかなかった。 'mapAccumL'は' traverse = mapM'の項で定義され、 '消費 'の方向に融合します(つまり' foldr'を使用します)。しかし、 'production'の方向に融合しません('ビルド ')。 – gksato
ああ。いい視点ね。それについて考えていたはずです。まだ 'zip'よりやや優れています。 :) – Alec