问题标签 [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 回答
128 浏览

haskell - 不安全的 IO 或:Haskline 和目录

免责声明:我对 Haskell 有点陌生。

我正在写一个解释器,或者,在这种情况下,一个 REPL。为此,我使用了 haskeline,这对 REPL 来说很好。它具有将命令行历史记录存储在文件中的能力,这也很好。

但是,我在使用它时遇到的一个问题是它似乎没有将“~”扩展到主目录,这意味着我必须手动检索主目录。

我可以这样做(目前正在这样做):

但这使用unsafePerformIO,这让我畏缩。您知道不涉及重写整个函数的良好且干净的解决方法吗?这可能是haskeline我不知道的功能,也可能是我没有看到的功能。

告诉我没有办法重写和重新思考这一切也很好。

编辑:

我知道unsafePerformIO这很糟糕,这就是为什么它让我畏缩。如果你是 Haskell 的新手并且现在正在阅读这个问题:假装它不存在。

0 投票
1 回答
717 浏览

haskell - 如何映射和连接 FilePath?

我仍在研究 Haskell,尤其是 IO monad。

我有一个目录路径列表,例如,

["/some/path", "/another/path", "/yet/another/path", "/still/more"]

我想将此列表映射到每个路径的完全限定内容列表(没有.and ..),如下所示:

["/some/path/file.1", "/some/path/somedir", "/some/path/file.2", "/another/path/file.a", "/another/path/a/directory", "/another/path/file.b", "/still/more/file.alpha", ...]

我想我可以用某种双地图来做到这一点,就像这样:

pathItems <- mapM (\pd -> MapM (\contents -> (pd </>) contents) (getDirectoryContents pd) pathDirs

但这不起作用。我得到的错误是:

0 投票
2 回答
774 浏览

haskell - 迭代一个列表,直到结果列表是一个空列表

我想看看我是否可以做这样的事情:

假设我有一个列表:[1, 8, 90, 100, 82]

现在,我想做的是这样的

所以基本上,我想打印列表的其余部分,直到我得到一个空列表,然后停止。有什么方法可以在 Haskell 中做到这一点吗?

编辑:我正在寻找更通用的解决方案。例如,我也希望能够产生这个:

列表 [10, 80, 90, 82, 28]

0 投票
1 回答
263 浏览

haskell - 为什么 GHCI 在出现错误后会“卡”在错误状态?

首先,我为非描述性标题道歉。因为我不知道实际发生了什么,所以我不能让它更具体。

现在我的问题。我已经为99 个 Haskell 问题中的第 23 个问题实现了以下代码段,它应该从列表中随机选择n项目:

现在,当我加载它时,ghci它适用于有效参数:

但是,当我使用超出范围的索引时,会发生奇怪的事情:

如您所见,发生了以下 2 件(对我而言)意想不到的事情:

  1. 它不是直接给出错误,而是首先打印输入的排列。
  2. 在它给出一次错误后,它将不再执行。

我怀疑 1. 与惰性评估有关,但我完全不知道为什么 2. 会发生。这里发生了什么?

0 投票
2 回答
178 浏览

sockets - 在 Haskell 中将 IO 递归循环重构为 monad 折叠

我写了一个 tcp 服务器,这是我的主循环方法:

(注意:handleConn :: Socket -> IO ()是我的程序特有的功能。)

我想将其重构为更单子的方式,这是我的尝试:

但这会使程序在我开始通过套接字发送数据时崩溃。

这是我的问题:为什么?解决办法是什么?

0 投票
0 回答
66 浏览

haskell - IO monad 和排序

我正在玩 IO monad 并学习在 Haskell 中利用副作用,似乎我弄错了。

考虑以下代码:

我在这里的理解是do将三个 IO 单子“粘合”成一个。我的假设是它们将按顺序执行,即“test”将首先打印,然后 line read,然后 dummyreturn ()将产生()

但是,当我运行已编译的应用程序时,它总是在打印“测试”之前等待读取行。

重新排序putStr/getLine没有任何作用。来自 IO monad 的“展开”值,如下所示:

...也不会改变结果。

我在这里想念什么?如何强制执行 IO 操作的顺序?

0 投票
3 回答
272 浏览

haskell - <|> 的替代 IO 错误

我将运算符<|>用于:

但是当我尝试编译它时,我得到:

这个错误对我来说有点模糊。知道如何解决吗?(顺便说一句,从这个回复中得到一些见解:对“替代”类型类的含义及其与其他类型类的关系感到困惑

0 投票
3 回答
249 浏览

haskell - 内联读取数字

想象一下,我通过标准输入读取了一个如下所示的输入块:

第一个数字是后面的行数。我必须通过一个函数处理这些数字并报告结果,并用空格分隔。

所以我写了这个主函数:

当然,由于read getLine.

但是正确(阅读:Haskell方式)正确执行此操作的方法是什么?甚至可以将此函数编写为单行吗?

0 投票
2 回答
328 浏览

haskell - 没有 do-blocks 或累积括号的惯用 Haskell 语法?

我对 Haskell 相当陌生,并且一直在尝试找到一种方法将多个受 IO 污染的值传递给处理 C 库的函数。大多数人似乎在 do 块中使用 <- 运算符,如下所示:

这让我觉得我在做 C,除了 emacs 不能自动缩进。我试着用更 Lispy 的风格来写这个:

这看起来像一团糟,并且有一串闭括号,你必须在最后数数(除此之外,emacs 可以在 Lisp 中可靠地协助完成这项任务,但在 Haskell 中则不行)。还有一种说法是

它看起来很整洁,但不是基础语言的一部分。

从 IO 污点盒中剥离值是否有任何不那么费力的符号?也许有更清洁的方式使用 lift* 或 fmap?我希望不要太主观地问什么被认为是“惯用的”?

此外,任何使 emacs 比(Haskell Ind)模式更好地协作的技巧将不胜感激。谢谢!

约翰

编辑:我偶然发现了https://wiki.haskell.org/Do_notation_considered_harmful并意识到我写的 lambda 链中的嵌套括号是不必要的。然而,社区(和 ghc 实现者)似乎已经接受了 Applicative-inspired 风格,使用 、<*> 等,这似乎使代码更容易阅读,尽管在弄清楚运算符优先级方面很头疼。

0 投票
3 回答
408 浏览

haskell - 包含在 IO 中的惰性列表

假设代码

当我g在 ghci 中运行时,它会导致 stackoverflow。但我在想也许它可以被懒惰地评估并[0, 0, 0]IO. 我怀疑IO是这里的罪魁祸首,但我真的不知道。显然,以下工作:


编辑:事实上我对拥有这么简单的功能不感兴趣f,原始代码看起来更像是:

h进行一些IO计算并将无效 ( Left) 响应存储在列表中,直到产生有效响应 ( Right)。尝试是懒惰地构造列表,即使我们在IOmonad 中。这样阅读结果的人h甚至可以在列表完成之前开始使用它(因为它甚至可能是无限的)。如果读取结果的人无论如何只关心第一个3条目,则甚至不必构建列表的其余部分。而且我感觉这是不可能的:/。