Yro*_*irg 5 performance haskell
我不知道它是否是一个有效的术语'懒惰类型'.但是,IO仍然很懒惰
import Control.Monad
import Data.List
result :: IO Double
result = foldl1' (liftM2 (+)) $ map return [1..10000000]
result' :: IO Double
result' = return $ foldl1' (+) [1..10000000]
Run Code Online (Sandbox Code Playgroud)
result
很慢,并且使用大量内存,不像result'
.怎么折叠[IO a]
?
result
在IO Double
不评估任何中间结果的情况下构造一个大值,仅在需要总结果时才发生,例如用于打印.foldl'
将中间结果评估为弱头正常形式,即最外层构造函数或lambda.由于(在GHC中)IO a
具有构造函数IO
,因此折叠的中间结果具有形式
IO (some computation combined with another)
Run Code Online (Sandbox Code Playgroud)
并且IO
每一步下的表达都变得更加复杂.
为避免这种情况,您不仅要强制中间IO
值,还要强制它们返回的值,
main :: IO ()
main = foldlM' (\a -> fmap (a+)) 0 (map return [1.0 .. 10000000]) >>= print
foldlM' :: Monad m => (a -> b -> m a) -> a -> [b] -> m a
foldlM' foo a [] = return a
foldlM' foo a (b:bs) = do
c <- foo a b
c `seq` foldlM' foo c bs
Run Code Online (Sandbox Code Playgroud)
适合你的榜样.
归档时间: |
|
查看次数: |
236 次 |
最近记录: |