Mas*_*tic 1 haskell lazy-evaluation
我想有一个懒惰生成的随机数列表,我设法做到但是unsafeInterleaveIO:
rs :: Random a => (a,a) -> IO [a]
rs b = do
r <- randomRIO b
ns <- unsafeInterleaveIO $ rs b
return (r:ns)
Run Code Online (Sandbox Code Playgroud)
有没有安全的方法来实现这种价值观?
如果你想要"延迟生成带有效果的元素",一种解决方案是避开传统的列表类型并使用List monad转换器,就像ListT管道库一样:
import System.Random
import Control.Monad
import Pipes
import qualified Pipes.Prelude as P
rs :: rs :: (Random a, MonadPlus m, MonadIO m) => (a,a) -> m a
rs b = liftIO (randomRIO b) `mplus` rs b
main :: IO ()
main = runEffect $ enumerate (rs (1::Int,10)) >-> P.take 5 >-> P.print
Run Code Online (Sandbox Code Playgroud)
结果是:
*Main> :main
7
2
5
6
4
Run Code Online (Sandbox Code Playgroud)
但是,这会阻止您使用传统的列表函数来使用"有效列表"; 你被推入管道生态系统.
(应用型折叠从与foldl包也可用于消耗的列表中,与impurely和foldM辅助功能.)
将MonadPlus在定义effectful列为描述接口应使用尽可能多的,在这里.它使有效列表更多地与库无关.
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |