问题标签 [io-monad]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
list - 在 Haskell 中将随机生成的列表作为参数传递
我是 Haskell 的新手,在整个 IO 方面确实遇到了麻烦。
我试图找出在haskell中遍历一个列表需要多长时间。我想生成一个随机数列表并将其作为参数传递给函数,以便我可以打印列表中的每个元素。我正在使用 CRITERION 包进行基准测试。这是代码:
运行代码时出错:
scala - 猫效应纤维自动消除
我对猫的效果很陌生,我已经喜欢并享受它了:)
这是关于纤维的
正如我看到的那样,纤维可以被取消,我试图看看是否有可能有一个带有纤维列表的 IO,当任何纤维发生错误时,可以取消其余的纤维(不确定这是否可以用IO 的纯粹性质)
例如:
有可能实现这样的事情吗?
任何帮助/提示将不胜感激
scala - 猫效应 0.10.1 中的括号类型类
我正在使用cats-effect 0.10.1,发现Bracket
此版本中没有类型类。所以这似乎我需要为此引入一些解决方法。
我正在设计从某个来源(副作用)读取的功能。所以我有 \
这个问题f: (DataFormat, ReadableByteChannel) => T
是不纯的。因此,我将使其f: (DataFormat, ReadableByteChannel) => IO[T]
无法在上面的示例中释放资源(因为flatMap
在这种情况下我需要这样做)。
您能否提出任何解决方法并保持功能纯净?
haskell - 使用 StateT s IO a 的内存泄漏在哪里?
意图:学习 Haskell 的小应用程序:下载 wikipedia-article,然后下载从它链接的所有文章,然后下载从它们链接的所有文章,依此类推......直到达到指定的递归深度。结果保存到文件中。
方法:使用 aStateT
来跟踪下载队列,下载文章并更新队列。我递归地建立一个列表IO [WArticle]
,然后打印它。
问题:在进行分析时,我发现使用的总内存与下载的文章数量成正比。
分析:根据文献,我相信这是一个懒惰和/或严格的问题。BangPatterns 减少了内存消耗,但没有解决比例问题。此外,我知道所有文章都是在文件输出开始之前下载的。
可能的解决方案:
1)函数getNextNode :: StateT CrawlState IO WArticle
(下)已经有IO。一种解决方案是只在其中写入文件并仅返回状态。这意味着文件被写入非常小的块。感觉不是很Haskell..
2)具有函数buildHelper :: CrawlState -> IO [WArticle]
(如下) return [IO WArticle]
。虽然我不知道如何重写该代码,并且在评论中被建议不要这样做。
这些提议的解决方案中的任何一个是否比我认为的更好,或者是否有更好的替代方案?
完整代码位于https://gitlab.com/mattias.br/sillyWikipediaSpider。当前版本仅限于下载每个页面的前八个链接以节省时间。在不改变它的情况下,以大约 600 MB 的堆使用量下载 55 个页面。
谢谢你的帮助!
haskell - 在 IO monad 中进行递归
我一直试图弄清楚如何在 IO monad 中进行递归。我熟悉使用纯函数进行递归,但无法将这些知识转移到 IO monads。
使用纯函数递归
我很乐意使用纯函数进行递归,例如foo
下面的函数。
具有 IO [String] 输出
的函数我创建了一个如下goo
所示的函数,它可以满足我的需要并具有 IO 输出。
尝试在 IO monad
中进行递归 当我尝试在 IO monad 中进行递归时(例如,“main”函数),我做不到。我查找了liftM
,replicateM
和 undo-the-IO<-
运算符或函数。我想要一个类似hoo
or的 IO monad hoo'
(为接下来的胡言乱语道歉)。
或者
(顺便说一句,如果你想知道我的项目是什么,我正在为一门课程从头开始编写遗传算法程序。我的函数需要两个父母并繁殖两个后代,因为使用随机数生成器goo
,它们作为 IO 返回。goo
我需要做的是使用递归hoo
函数goo
从 20 个父母的列表中繁殖 20 个后代。我的想法是取列表中的前两个父母,繁殖两个后代,带上接下来的两个父母名单,繁殖另一对后代,依此类推。)
haskell - 稍后从 IO 操作中解包值
您好,我想知道您以后如何在 IO monad 中解开一个值?如果a<-expression
将结果绑定到a
然后我不能(<-expression)
用作给定方法的参数,例如:
method (<-expression)
哪里方法method
接受评估结果?
代码
我没有进入只是基本和块的Monad
章节,但我想它与单子有关。然后,如果我想通过if 评估,我不能使用类似的东西:<-
do
result
hGetLine
haskell - 如何在递归 IO 操作中使用累加器
我有以下问题:
我想逐行读取文件并将这些行写入另一个文件。但是,我想返回行数。
因此,在纯函数中,我会使用这样的累加器:
如何在不使用其他功能的情况下在 do-block 中实现相同的功能?
具体例子
编辑
重构loop
获取参数的方式
PS 2(在KA Buhr彻底回应后)
一、我真正想要达到的,是main
方法的最后一个表达。我想获取多个IO Action
s 并将它们的结果绑定到一个方法。具体来说:
在这种情况下我不明白的是:
如果inHandle>>=
被提供给\a ->
然后结果被传递给...>>=\b
,外部范围内的变量是否被关闭\b
?
如果不是,不应该>>=\a->..>>= \a b
吗?内部作用域不应该持有与外部作用域的结果相对应的参数吗?
消除辅助方法中的 do
我想知道的是,是否有一种方法可以将多个动作粘合在一起而不将它们放在一个do
块中。
就我而言:
我不能说这样的话:
if ... then ...
else
hPutStrLn=<<action1 [something] v2=<<action2 [something] loop inh outh (cnt+1)
哪里something
可能是运营商?我不知道,这就是我问的原因。
haskell - 如何在 Haskell 中为 IO 专门化 mapM
假设我有一个任务,它代表一些计算,从k
那里v
必须从外部获取一些输入。
对于某些任务mapM
将被使用,例如获取多个密钥。我想专门mapM
研究一些单子。专门针对IO
我想用来Control.Concurrent.Async.mapConcurrently
同时执行 IO 操作的 monad。
我的第一直觉是引入一个包装器类型
然后介绍
但是这不起作用,因为在当前的 GHC 实现mapM
中是用 定义的traverse
,即在Traversable
.
有没有一个优雅的解决方案?
haskell - 为 GHCI 重新装箱纯值的目的
有人可以向我解释为什么在使用时ghci
我必须“重新装箱”单子返回的值吗?
错误:
我不明白我的逻辑在哪里有缺陷:
- 使用
listAction
给了我一个IO [FilePath]
listAction
我将to的值拆箱并将[FilePath]
其提供给length
- 现在不应该
length
只是将结果打印到控制台作为纯函数吗?如果我说的话不一样length [1,2,3]
吗?
为什么我必须再次装箱?不是类型单子的结果:[FilePath]
如果是,为什么它不能打印结果?
haskell - 自定义类型的 Monad 和 MonadIO
我有一种 Logger 类型,* -> *
它可以采用任何类型并将值记录在文件中。我试图以一种单子的方式实现这一点,以便我登录并继续工作。我的代码看起来像
liftIO 函数在调用自身时会进行无限循环。我也不能做 b <- a 。有人可以帮助正确实施 MonadIO 吗?