Tembel bir listeyi sabit alanda monadik eylemler kullanarak nasıl katlayabilirim? Çözmeyi denediğim problem büyük bir dosya topluyor, ve performans uğruna mutabiliteye ihtiyacım olduğuna inanıyorum. ST'de mutable vektörleri kullanarak çalışan bir uygulama var, ama çok fazla bellek kullanıyor. Aşağıda, denediğim şeyin bir örneği var. Ayrıca Conduit ile kısa bir süre deney yaptım, ancak bu herhangi bir gelişme sağladı.Sabit Alanda Monadic Katlama
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
Boru:
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
Performans ayarlama için: “STT s Identity” nin her zamanki “ST s” üzerinde bir miktar tahsisatı olacaktır; Eğer tuhaf 'STT' güçlerine ihtiyacınız yoksa, sadece 'ST' kullanmak isteyebilirsiniz. – dfeuer
@dfeuer Gerçekten de onu kaldırabilirim, ancak ilk başta 'Her şeyi' gömmek zorunda kalmayı bekleyen uygulamaya koydum ve aktarıldı. Bahşiş için teşekkürler! – ryachza