JavaScript `then` 和 Haskell `fmap` 一样吗?

Won*_*Hau 0 javascript haskell functional-programming

在 JavaScript 中,Promises 有一个名为 的方法then,用于在成功的情况下解包结果,例如,

fetch("google.com").then(console.log)
Run Code Online (Sandbox Code Playgroud)

这个 Haskell 的教程中,我还发现了一个类似的东西fmap,例如,

fmap putStrLn (fetch "google.com")
Run Code Online (Sandbox Code Playgroud)

它们看起来非常相似,但我不确定它们是否等效。这就是为什么我想问他们是否是同一件事。

PS:“等效”一词应与 Curry-Howard Correspondence 等效。

dan*_*iaz 6

他们是相关的,是的。但是thenfor Promises 做了几个不同的事情,在 Haskell 中将是单独的函数,而不是全部来自Functor类(提供 的那个fmap)。

在 Haskell 中,Promise将是一个类型构造函数,由它最终返回的类型参数化,例如Promise Intor Promise String

我们可以使该类型成为 的实例Functor,从而为我们提供fmap :: (a -> b) -> Promise a -> Promise b. 这将让我们对 Promise 最终返回的结果进行计算映射。但它不会让我们连锁承诺!如果我们尝试使用返回承诺的函数进行 fmapping,比如说 type Int -> Promise String,我们最终会得到一个在最后Promise返回另一个Promise但没有执行它的函数,这不是我们通常想要的。

我们也可以创建Promise一个Monad. Monad是 的子类Functor。所有的Monads 都是Functors,但并非所有的Functors 都是Monads。Monad将为我们提供>>=具有 type的函数(通常称为“绑定”)(>>=) :: Promise a -> (a -> Promise b) -> Promise b。这类似于 a then,其中回调返回Promise在原始回调之后排序的另一个。