问题标签 [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.

0 投票
1 回答
94 浏览

list - 在 Haskell 中将随机生成的列表作为参数传递

我是 Haskell 的新手,在整个 IO 方面确实遇到了麻烦。

我试图找出在haskell中遍历一个列表需要多长时间。我想生成一个随机数列表并将其作为参数传递给函数,以便我可以打印列表中的每个元素。我正在使用 CRITERION 包进行基准测试。这是代码:

运行代码时出错:

0 投票
0 回答
283 浏览

scala - 猫效应纤维自动消除

我对猫的效果很陌生,我已经喜欢并享受它了:)

这是关于纤维的

正如我看到的那样,纤维可以被取消,我试图看看是否有可能有一个带有纤维列表的 IO,当任何纤维发生错误时,可以取消其余的纤维(不确定这是否可以用IO 的纯粹性质)

例如:

有可能实现这样的事情吗?

任何帮助/提示将不胜感激

0 投票
0 回答
193 浏览

scala - 猫效应 0.10.1 中的括号类型类

我正在使用cats-effect 0.10.1,发现Bracket此版本中没有类型类。所以这似乎我需要为此引入一些解决方法。

我正在设计从某个来源(副作用)读取的功能。所以我有 \

这个问题f: (DataFormat, ReadableByteChannel) => T是不纯的。因此,我将使其f: (DataFormat, ReadableByteChannel) => IO[T]无法在上面的示例中释放资源(因为flatMap在这种情况下我需要这样做)。

您能否提出任何解决方法并保持功能纯净?

0 投票
2 回答
686 浏览

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 个页面。

谢谢你的帮助!

0 投票
3 回答
572 浏览

haskell - 在 IO monad 中进行递归

我一直试图弄清楚如何在 IO monad 中进行递归。我熟悉使用纯函数进行递归,但无法将这些知识转移到 IO monads。

使用纯函数递归
我很乐意使用纯函数进行递归,例如foo下面的函数。

具有 IO [String] 输出
的函数我创建了一个如下goo所示的函数,它可以满足我的需要并具有 IO 输出。

尝试在 IO monad
中进行递归 当我尝试在 IO monad 中进行递归时(例如,“main”函数),我做不到。我查找了liftM,replicateM和 undo-the-IO<-运算符或函数。我想要一个类似hooor的 IO monad hoo'(为接下来的胡言乱语道歉)。

或者

(顺便说一句,如果你想知道我的项目是什么,我正在为一门课程从头开始编写遗传算法程序。我的函数需要两个父母并繁殖两个后代,因为使用随机数生成器goo,它们作为 IO 返回。goo我需要做的是使用递归hoo函数goo从 20 个父母的列表中繁殖 20 个后代。我的想法是取列表中的前两个父母,繁殖两个后代,带上接下来的两个父母名单,繁殖另一对后代,依此类推。)

0 投票
1 回答
181 浏览

haskell - 稍后从 IO 操作中解包值

您好,我想知道您以后如何在 IO monad 中解开一个值?如果a<-expression将结果绑定到a然后我不能(<-expression)用作给定方法的参数,例如: method (<-expression)哪里方法method接受评估结果?

代码

我没有进入只是基本和块的Monad章节,但我想它与单子有关。然后,如果我想通过if 评估,我不能使用类似的东西:<-doresulthGetLine

0 投票
1 回答
350 浏览

haskell - 如何在递归 IO 操作中使用累加器

我有以下问题:

我想逐行读取文件并将这些行写入另一个文件。但是,我想返回行数。

因此,在纯函数中,我会使用这样的累加器:

如何在不使用其他功能的情况下在 do-block 中实现相同的功能?

具体例子

编辑

重构loop获取参数的方式

PS 2(在KA Buhr彻底回应后)

、我真正想要达到的,是main方法的最后一个表达。我想获取多个IO Actions 并将它们的结果绑定到一个方法。具体来说:

在这种情况下我不明白的是:

如果inHandle>>=被提供给\a ->然后结果被传递给...>>=\b,外部范围内的变量是否被关闭\b

如果不是,不应该>>=\a->..>>= \a b吗?内部作用域不应该持有与外部作用域的结果相对应的参数吗?

消除辅助方法中的 do

我想知道的是,是否有一种方法可以将多个动作粘合在一起而不将它们放在一个do块中。

就我而言:

我不能说这样的话:

if ... then ...
else
hPutStrLn=<<action1 [something] v2=<<action2 [something] loop inh outh (cnt+1)

哪里something可能是运营商?我不知道,这就是我问的原因。

0 投票
2 回答
216 浏览

haskell - 如何在 Haskell 中为 IO 专门化 mapM

假设我有一个任务,它代表一些计算,从k那里v必须从外部获取一些输入。

对于某些任务mapM将被使用,例如获取多个密钥。我想专门mapM研究一些单子。专门针对IO我想用来Control.Concurrent.Async.mapConcurrently同时执行 IO 操作的 monad。

我的第一直觉是引入一个包装器类型

然后介绍

但是这不起作用,因为在当前的 GHC 实现mapM中是用 定义的traverse,即在Traversable.

有没有一个优雅的解决方案?

0 投票
1 回答
59 浏览

haskell - 为 GHCI 重新装箱纯值的目的

有人可以向我解释为什么在使用时ghci我必须“重新装箱”单子返回的值吗?

错误:

我不明白我的逻辑在哪里有缺陷:

  1. 使用listAction给了我一个IO [FilePath]
  2. listAction我将to的值拆箱并将[FilePath]其提供给length
  3. 现在不应该length只是将结果打印到控制台作为纯函数吗?如果我说的话不一样length [1,2,3]吗?

为什么我必须再次装箱?不是类型单子的结果:[FilePath]如果是,为什么它不能打印结果?

0 投票
1 回答
792 浏览

haskell - 自定义类型的 Monad 和 MonadIO

我有一种 Logger 类型,* -> *它可以采用任何类型并将值记录在文件中。我试图以一种单子的方式实现这一点,以便我登录并继续工作。我的代码看起来像

liftIO 函数在调用自身时会进行无限循环。我也不能做 b <- a 。有人可以帮助正确实施 MonadIO 吗?