相关疑难解决方法(0)

Haskell的mapM不是懒惰吗?

更新:好的,这个问题可能非常简单.

q <- mapM return [1..]
Run Code Online (Sandbox Code Playgroud)

为什么这永远不会回来?


mapM是不是懒得处理无限列表?

下面的代码挂起.但是,如果我用线B替换A线,它就不会再挂起了.或者,如果我在A行之前加上"splitRandom $",它也不会挂起.

Q1是:mapM不是懒惰的吗?否则,为什么用线B替换A行"修复此"代码?

Q2是:为什么前面的A行与splitRandom"解决"了这个问题?

import Control.Monad.Random
import Control.Applicative

f :: (RandomGen g) => Rand g (Double, [Double])
f = do
    b <- splitRandom $ sequence $ repeat $ getRandom
    c <- mapM return b -- A
    -- let c = map id b -- B
    a <- getRandom
    return (a, c)

splitRandom :: (RandomGen g) => Rand g a -> Rand g a
splitRandom code = evalRand code <$> getSplit

t0 …
Run Code Online (Sandbox Code Playgroud)

monads haskell lazy-evaluation

18
推荐指数
3
解决办法
2961
查看次数

如何在计算列表时输出值?

我有一个长时间运行的计算输出列表.我想在计算它们时输出此列表中的值.这样做的方法是什么?

目前我用来mapM_ print将每个值打印到STDOUT.这对于在命令行中打印值的简单情况来说效果很好,但感觉有点hacky并且难以使用.

此外,在某些时候,我想将命令行输出转换为交互式可视化.我怎么能把我的名单变成像FRP的一系列事件?能够将其作为事件源插入现有的GUI框架中会很棒.

重写函数以使用除列表之外的其他内容是一种选择,尽管允许我按原样获取列表的解决方案是理想的.

haskell frp

6
推荐指数
1
解决办法
160
查看次数

标签 统计

haskell ×2

frp ×1

lazy-evaluation ×1

monads ×1