- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新:好的,这个问题可能变得非常简单。
q <- mapM return [1..]
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 = do
(a, b) <- evalRand f <$> newStdGen
print a
print (take 3 b)
最佳答案
嗯,有懒惰,然后有懒惰。 mapM
确实很懒惰,因为它没有做比它必须做的更多的工作。但是,请查看类型签名:
mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]
a -> m b
和一堆
a
s。一个普通的
map
可以把那些变成一堆
m b
s,但不是
m [b]
.组合
b
的唯一方法s 成单个
[b]
没有 monad 的阻碍是使用
>>=
对
m b
进行排序s 一起构建列表。
mapM
正好等价于
sequence . map
.
>>=
的整个链s 导致表达式必须是强制的,所以应用
sequence
一个无限的列表永远无法完成。
mapM
这样的简单递归函数和
sequence
不要提供 - 或一步一步的顺序,如下所示:
data Stream m a = Nil | Stream a (m (Stream m a))
splitRandom
,发生了什么是你传递给它
Rand
计算,使用种子
splitRandom
进行评估得到,然后
return
结果。没有
splitRandom
,单
getRandom
使用的种子必须来自对无限列表排序的最终结果,因此它挂起。额外的
splitRandom
,使用的种子只需要穿过两个
splitRandom
调用,所以它工作。随机数的最终列表有效,因为您离开了
Rand
monad 在那一点上,没有什么取决于它的最终状态。
关于haskell - Haskell 的 mapM 不懒吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3270255/
假设,我在使用 IO 时得到了大量的项目列表: as IO b转至 as : as (a -> m b) -> [a] -> m [b] ,这就是我在类型匹配方面所需要的。但它会在内存中构建所有链
给定返回 m (Maybe a) 的操作列表我正在尝试返回 m (Maybe [a])如果任何单个结果是 Nothing整个结果是 Nothing . m包含 StateT我想避免在第一个 Nothi
考虑以下简单的 IO 函数: req :: IO [Integer] req = do print "x" return [1,2,3] 实际上,这可能是一个 http 请求,它在解析结果后返
在我最近的 work与 Gibbs sampling ,我一直在充分利用 RVar 在我看来,它为随机数生成提供了一个近乎理想的接口(interface)。遗憾的是,由于无法在 map 中使用 mon
考虑以下 Haskell 语句: mapM print ["1", "2", "3"] 实际上,这会按顺序打印“1”、“2”和“3”。 问题:你怎么知道mapM会先打印“1”,然后打印“2”,最后打印
据我了解forM与 mapM 相同,只有论点被颠倒。 这是否意味着我可以替换每个 forM与 mapM反之,如果我颠倒我给他们的论点? 最佳答案 的确。 forM是 literally只是... fo
更新:好的,这个问题可能变得非常简单。 q Rand g (Double, [Double]) f = do b Rand g a -> Rand g a splitRandom code
在交互模式下使用 mapM 时:调用 mapM putStrLn ["random","Text"]输出是 random text [(),()] 然而,当我从脚本调用相同的函数然后运行脚本时: ma
Prelude> mapM putStrLn ["a", "b"] a b [(),()] Prelude> mapM_ putStrLn ["a", "b"] a b 为什么第一个版本显示第三行而第
考虑以下示例: safeMapM f xs = safeMapM' xs [] where safeMapM' [] acc = return $ reverse acc
在交互模式下使用 mapM 时:调用 mapM putStrLn ["random","Text"]输出是 random text [(),()] 然而,当我从脚本调用相同的函数然后运行脚本时: ma
我正在查看 Real World Haskell 的 I/O 章节。书中另外 7 章没有讨论 Monad。也就是说,我对 I/O 的理解充其量是不完整的。 现在我正在尝试理解mapM函数。据我了解,该
这是一种奇怪的行为,即使对 Haskell 来说也是如此。看下面的代码段: import System.Directory import System.FilePath -- This spins i
我在 Haskell 中编写了一个非常简单的两遍汇编程序,我遇到了一个我还没有经验来解决的场景。我认为解决方案很可能涉及单子(monad)变压器,我不太了解。 汇编器将汇编代码解析为 Statemen
我的应用程序需要在运行时打开多个资源。我通过映射 openFile 来实现这一点一次在应用程序的开始。 let filePaths = ["/dev/ttyUSB0", "/dev/ttyUSB1",
我最近需要以下功能。这个想法是拉上原来的xs值以及 mapM f xs值。 zipMapM f xs = fmap (zip xs) (mapM f xs) 把它通过pointfree,我得到了什么,
由于我一直在寻找优化我一直在制作的密码破解程序的方法,我遇到了一个列表中所有可能的字符组合的更短的实现,它使用了这个函数: mapM (const xs) [1..n] 哪里xs可能是可用的字符,和
cats 是否提供了与 Haskell 中的 mapM 等效的功能?它应该看起来像: def mapM[A, B, F[_], Col[_]] (col: Col[A])(f: A => F[
我正在想办法结合traverseOf与 >>=以这样的方式允许以下内容。 TLDR;普通 Haskell 中的一个简单示例如下所示,但使用数据结构深处的透镜。 λ> fmap concat $ map
ByteString 有标准(纯) map 函数和 Text : map :: (Word8 -> Word8) -> ByteString -> ByteString map :: (Char ->
我是一名优秀的程序员,十分优秀!