小编Dou*_*ira的帖子

使用严格的 monad 操作无限列表

我有一个f :: [a] -> b对无限列表进行操作的函数(例如take 5takeWhile (< 100) . scanl (+) 0等等)。我想为这个函数提供由严格的单子动作(例如randomIO)生成的值。

这个问题中,我了解到repeatandsequence技巧方法不适用于严格的单子,如下例所示:

import Control.Monad.Identity

take 5 <$> sequence (repeat $ return 1) :: Identity [Int]
-- returns `Identity [1,1,1,1,1]`
-- works because Identity is non-strict

take 5 <$> sequence (repeat $ return 1) :: IO [Int]
 -- returns `*** Exception: stack overflow`
 -- does not work because IO is strict
Run Code Online (Sandbox Code Playgroud)

因此,我考虑在单子上下文“内部”使用该函数。我受到这个循环编程示例的启发并尝试:

let loop …
Run Code Online (Sandbox Code Playgroud)

monads haskell lazy-evaluation strictness conduit

3
推荐指数
1
解决办法
435
查看次数

标签 统计

conduit ×1

haskell ×1

lazy-evaluation ×1

monads ×1

strictness ×1