定数空間でのモナドアクションを使用してレイジーリストを折り畳むにはどうすればよいですか?私が解決しようとしている問題は、大きなファイルを集約することです。パフォーマンスのために私は変更可能性が必要だと考えています。私は変更可能なベクトルを使用してSTで動作する実装を持っていますが、あまりにも多くのメモリを使います。以下は、私が試みていることの例です。私もコンジットで簡単に実験しましたが、改善は見られませんでした。定数空間のMonadic Fold
ST forM_:
import Control.Monad (forM_)
import Control.Monad.ST.Trans as STT
import Control.Monad.Identity as Identity
testST :: Int
testST = do
Identity.runIdentity $ STT.runST $ do
a <- STT.newSTRef 0
forM_ [1..10000000] (\x -> do
a' <- STT.readSTRef a
STT.writeSTRef a (a' + x)
)
STT.readSTRef a
コンジット:
import Data.Conduit (($=),(=$),($$))
import qualified Data.Conduit as C
import qualified Data.Conduit.List as CL
testCL :: IO Int
testCL = CL.sourceList [1..10000000] $$ CL.foldM (\a x -> return (a + x)) 0
パフォーマンスチューニングのために: 'STT s Identity'は通常の' ST s'よりいくらかの割り当てオーバーヘッドを持つように見えます。独特の 'STT'力が必要ない場合は' ST'を使うだけです。 – dfeuer
@dfeuer確かに私はそれを削除するかもしれませんが、私はそれを最初に 'Either'を埋め込む必要があると思って実装に入れ、それが転送されました。ヒントをありがとう! – ryachza