问题标签 [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.
haskell - 不安全的 IO 或:Haskline 和目录
免责声明:我对 Haskell 有点陌生。
我正在写一个解释器,或者,在这种情况下,一个 REPL。为此,我使用了 haskeline,这对 REPL 来说很好。它具有将命令行历史记录存储在文件中的能力,这也很好。
但是,我在使用它时遇到的一个问题是它似乎没有将“~”扩展到主目录,这意味着我必须手动检索主目录。
我可以这样做(目前正在这样做):
但这使用unsafePerformIO
,这让我畏缩。您知道不涉及重写整个函数的良好且干净的解决方法吗?这可能是haskeline
我不知道的功能,也可能是我没有看到的功能。
告诉我没有办法重写和重新思考这一切也很好。
编辑:
我知道unsafePerformIO
这很糟糕,这就是为什么它让我畏缩。如果你是 Haskell 的新手并且现在正在阅读这个问题:假装它不存在。
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
但这不起作用。我得到的错误是:
haskell - 迭代一个列表,直到结果列表是一个空列表
我想看看我是否可以做这样的事情:
假设我有一个列表:[1, 8, 90, 100, 82]
现在,我想做的是这样的
所以基本上,我想打印列表的其余部分,直到我得到一个空列表,然后停止。有什么方法可以在 Haskell 中做到这一点吗?
编辑:我正在寻找更通用的解决方案。例如,我也希望能够产生这个:
列表 [10, 80, 90, 82, 28]
haskell - 为什么 GHCI 在出现错误后会“卡”在错误状态?
首先,我为非描述性标题道歉。因为我不知道实际发生了什么,所以我不能让它更具体。
现在我的问题。我已经为99 个 Haskell 问题中的第 23 个问题实现了以下代码段,它应该从列表中随机选择n
项目:
现在,当我加载它时,ghci
它适用于有效参数:
但是,当我使用超出范围的索引时,会发生奇怪的事情:
如您所见,发生了以下 2 件(对我而言)意想不到的事情:
- 它不是直接给出错误,而是首先打印输入的排列。
- 在它给出一次错误后,它将不再执行。
我怀疑 1. 与惰性评估有关,但我完全不知道为什么 2. 会发生。这里发生了什么?
sockets - 在 Haskell 中将 IO 递归循环重构为 monad 折叠
我写了一个 tcp 服务器,这是我的主循环方法:
(注意:handleConn :: Socket -> IO ()
是我的程序特有的功能。)
我想将其重构为更单子的方式,这是我的尝试:
但这会使程序在我开始通过套接字发送数据时崩溃。
这是我的问题:为什么?解决办法是什么?
haskell - IO monad 和排序
我正在玩 IO monad 并学习在 Haskell 中利用副作用,似乎我弄错了。
考虑以下代码:
我在这里的理解是do
将三个 IO 单子“粘合”成一个。我的假设是它们将按顺序执行,即“test”将首先打印,然后 line read,然后 dummyreturn ()
将产生()
但是,当我运行已编译的应用程序时,它总是在打印“测试”之前等待读取行。
重新排序putStr
/getLine
没有任何作用。来自 IO monad 的“展开”值,如下所示:
...也不会改变结果。
我在这里想念什么?如何强制执行 IO 操作的顺序?
haskell - 内联读取数字
想象一下,我通过标准输入读取了一个如下所示的输入块:
第一个数字是后面的行数。我必须通过一个函数处理这些数字并报告结果,并用空格分隔。
所以我写了这个主函数:
当然,由于read getLine
.
但是正确(阅读:Haskell方式)正确执行此操作的方法是什么?甚至可以将此函数编写为单行吗?
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 风格,使用 、<*> 等,这似乎使代码更容易阅读,尽管在弄清楚运算符优先级方面很头疼。
haskell - 包含在 IO 中的惰性列表
假设代码
当我g
在 ghci 中运行时,它会导致 stackoverflow。但我在想也许它可以被懒惰地评估并[0, 0, 0]
用IO
. 我怀疑IO
是这里的罪魁祸首,但我真的不知道。显然,以下工作:
编辑:事实上我对拥有这么简单的功能不感兴趣f
,原始代码看起来更像是:
h
进行一些IO
计算并将无效 ( Left
) 响应存储在列表中,直到产生有效响应 ( Right
)。尝试是懒惰地构造列表,即使我们在IO
monad 中。这样阅读结果的人h
甚至可以在列表完成之前开始使用它(因为它甚至可能是无限的)。如果读取结果的人无论如何只关心第一个3
条目,则甚至不必构建列表的其余部分。而且我感觉这是不可能的:/。