问题标签 [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 投票
2 回答
158 浏览

haskell - 在任意 Monad 的上下文中,“一元结构”和“结构的元素”究竟意味着什么?

通读Control.Monad 的文档,我发现了这样的mapM描述:

将结构的每个元素映射到一个单子动作,从左到右评估这些动作,并收集结果

我很感兴趣,“结构元素”对于任意 monad 意味着什么?例如,State还是IO单子?什么结构?我知道mapM函数的作用,并且mapM. 这个“结构”是否与“代数结构”的概念有某种联系?

结构是一个集合,上面定义了一个或多个满足公理列表的有限运算。

如果是这样,那么我要求的这个结构(载体集)的元素是什么,例如 IO monad?一般来说?

0 投票
1 回答
48 浏览

haskell - 提升的“if”-函数行为异常

在我的程序中,我使用if'在其中一个模块中定义的函数而不是内置if-then-else构造。它的定义很简单,而且工作得很好。

但是,在代码中有一个地方我需要将它应用到 monad 值(IO在我的例子中),即类型签名应该看起来有点像IO Bool -> IO a -> IO a -> IO a. 自然地,我试图抬起它。

但是当我尝试评估表达式时,我没有得到我期望的结果。

我知道<*>描述是“顺序应用”,所以也许就是这样。但是这里发生了什么?我可以在不编写全新的专用函数的情况下修复它吗?

0 投票
2 回答
130 浏览

haskell - Haskell 的纯度是由类型系统还是 IO 的实现来强制执行的?

人们总是说 Haskell 的类型系统可以防止不纯代码污染纯代码,因为您总是必须IO在类型签名中指定。但是,这是类型系统本身的结果,还是真的只是IO(..)没有导出?

基本上,如果类型构造函数可用,这样的事情是否可以完成?

0 投票
2 回答
157 浏览

haskell - Parsec 和 liftIO,编译错误

我正在解析一种语言,我想$include在解析时对其他文件有语法。

我的代码:

来自 GHC 的错误消息:

我怎样才能让它工作?

0 投票
2 回答
447 浏览

haskell - IO monad 在什么意义上是特殊的(如果有的话)?

在深入研究 monad 之后,我了解到它们是一个通用概念,允许在某些上下文(失败、非确定性、状态等)内链接计算,并且它们背后没有魔法。

即使不是魔法,但 IO monad 仍然感觉很特别。

  • 你不能像其他 monad 一样逃避 IO monad
  • IO 动作只能由main函数运行
  • IO 始终位于 monad 转换器链的底部
  • IO monad 的实现尚不清楚,源代码显示了一些 Haskell 内部结构

以上几点的原因是什么?是什么让 IO 如此特别?

更新:纯代码评估顺序无关紧要。但是在做 IO 时确实很重要(我们想在阅读之前保存客户)。据我了解,IO monad 为我们提供了这样的排序保证。它是一般 monad 的属性还是 IO monad 特有的属性?

0 投票
1 回答
501 浏览

haskell - 在示例中结合 IO monad 和 State Monad

我为语句创建了简单的评估器。我想使用变压器来做到这一点 - 将 IO monad 与 State 混合。
有人可以解释怎么做吗?这是我无法处理的东西——变形金刚。

0 投票
1 回答
1210 浏览

haskell - 如何在 Haskell 中构造无操作 IO() 表达式?

这是我正在编写的特定于域的文件 IO 函数的摘录:

我知道mapM_让我们放弃/忽略所有IO ()结果,所以我想要一个更清洁的替代方案putStr ""——即。Haskell 的“规范”方式来编写“一个什么都不做的类型正确的无操作 IO(或 monad)表达式”。

从我的新手阅读中,我undefined想到了,虽然它可以编译并且不会导致任何问题,但它会提供不需要的标准输出打印main.hs: Prelude.undefined(我在这里stack runghc main.hs用作唯一的编码环境 --- 这已经足够了,但是上面的代码将递归循环通过目录树:因此是(重新)了解更好或更确切地说是“正确”方法的好时机)。

0 投票
1 回答
184 浏览

haskell - 回滚 IO 动作

我有一个非常简单的抽象来处理可以回滚(在某种程度上)的一系列 IO 动作,即如果一个动作写入一个文件,那么回滚将删除这个文件,或者如果一个动作创建一个目录树,修剪这将是回滚等。

它几乎可以满足我的要求,但我有一种强烈的预感,即有更多可组合和更可靠(在异常处理的意义上)的方法来做到这一点。所以我的问题是我可以使用某个库中已知的 monad 转换器来实现相同的想法吗?

有类似的东西

将比当前的解决方案更方便。

0 投票
2 回答
220 浏览

haskell - IO monad防止嵌入式mapM短路?

下面的代码有点神秘。在问题的非玩具版本中,我试图在 monad Result 中进行 monadic 计算,其值只能从 IO 中构造。似乎 IO 背后的魔力使此类计算变得严格,但我无法弄清楚这是如何发生的。

编码:

输出:

0 投票
1 回答
39 浏览

javascript - IO monad 中包含的组合函数是否保证不会产生不希望的效果?

我了解 IO 用于将纯代码与不纯代码分开。另外,我知道 IO 允许引用透明性。

不过,关于 IO 的一件事对我来说仍然有点模糊。也就是说,保证 IO 包含的操作之间不会发生任何不好的事情,因为它在调用时立即运行(因为它只不过是一个惰性组合)。所以,当这个惰性组合最终被调用时,没有其他并发代码可以扭曲它(这个惰性组合)。

真的是这样吗?IO 会比这样的一段代码更好(在这种情况下)吗?

我知道 IO 是解决此类问题的方法。

我的推理可以吗?