4

我一直在探索民间故事图书馆,发现了许多有用的结构。通过control.asyncdata.task使用任务后,我想使用 IO monad,但似乎找不到它。鉴于民间故事有多么丰富,我很惊讶,想知道我是否只是没有看到它。

民间故事中有 IO 单子吗?

4

1 回答 1

7

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

一个区别是它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)
于 2017-01-18T08:35:22.427 回答