【问题标题】:Does folktale have an IO monad?民间故事有 IO 单子吗?
【发布时间】:2015-11-08 16:55:33
【问题描述】:

我一直在探索folktale 库,发现了很多有用的构造。通过control.asyncdata.task 使用Tasks 后,我想使用一个IO monad,但似乎找不到它。鉴于民间故事如此丰富,我很惊讶,想知道我是否只是没有看到它。

民间故事中有 IO monad 吗?

【问题讨论】:

  • Task Error a 不等于IO a 吗?你到底错过了什么?
  • @Bergi - 如果我错了,请纠正我 - Task 不是用于异步任务吗?即task.fork(reject, resolve)?我认为IO 对于同步任务(任何会导致副作用的事情)会更方便,使用io.runIO() 调用。
  • 呃,我认为 IO 在 JS 中本质上是异步的,并且非常渴望,它只是在没有任何runIO 的情况下运行并导致其副作用。所以你只是在寻找State monad?
  • IO monad from monet.js 是另一个很好的例子。是的,我当然可以使用它。我只是想知道民间故事是否已经可以实现。
  • @Bergi:想了一会儿,我认为您对Task 的看法是正确的。不是完全我正在寻找的东西,但很容易达到IO 的目的。我认为他们倾向于将相同的构造用于稍微不同的目的,而不是使用太多相似的构造。谢谢!

标签: javascript functional-programming folktale


【解决方案1】:

在 Haskell 中,IO monad 由运行时提供(并且固有地绑定到)运行时。 Folktale 没有为运行时函数提供等效的功能,但是 Task 和 IO 具有相同的目的。 Haskell 中的 IO 操作 可以 是异步的,因此我们可以说它比例如 monet.js 中的 IO monad 更类似于 Haskell 的 IO。

一个区别是Task 提供错误处理,而 IO monad 不提供。

您可以在 JS 中使用 Tasks 进行编程,就像在 Haskell 中使用 IO 操作进行编程一样。您只需定义您使用 Tasks 使用的所有非纯运行时函数。

例如,以 Haskell 运行时提供的函数 print, (print :: Show a => a -> IO ()) 为例,它只打印其输入并且不返回任何内容。我们可以在 JS 中编写类似的函数,使用任务。它可能看起来像这样。

// Definition
const print = (input) => Task.task(r => {
    console.log(String(input))
    r.resolve(undefined)
})

// Usage
const main = Task.of("Hello world").chain(print)

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 2018-12-19
    • 2018-10-25
    • 2018-11-03
    • 2018-11-11
    • 1970-01-01
    • 2016-12-26
    • 2022-12-31
    • 1970-01-01
    相关资源
    最近更新 更多