【问题标题】:Is the JavaScript `then` the same as Haskell `fmap`?JavaScript `then` 和 Haskell `fmap` 一样吗?
【发布时间】:2018-11-20 03:52:11
【问题描述】:

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

fetch("google.com").then(console.log)

this Haskell's tutorial,我也发现了一个类似的东西,比如叫fmap

fmap putStrLn (fetch "google.com")

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

PS:等价这个词应该是 Curry-Howard Correspondence 的等价词。

【问题讨论】:

  • 如果你去新老师,不要想起老老师。
  • @WongJiaHau 如果您能像 Curry 和 Howard 定义他们对“等价”的使用一样谨慎地定义您对“等价”的使用,我将很乐意尝试回答您的问题。
  • 您的 Haskell 代码看起来不对 - 我确定应该是 fetch "google.com" >>= putStrLn
  • Why are Promises Monads?的可能重复
  • 不,它们在 Curry-Howard 意义上并不等价:事实上,无论是组合类型还是直觉隐含逻辑,它们都不是格式良好的术语。

标签: javascript haskell functional-programming


【解决方案1】:

它们是相关的,是的。但是then for Promises 做了几件不同的事情,这些事情在 Haskell 中将是单独的函数,而不是全部来自 Functor 类(提供 fmap 的类)。

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

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

我们也可以让Promise 成为Monad 的一个实例。 MonadFunctor 的子类。所有Monads 都是Functors,但并非所有Functors 都是Monads。 Monad 会给我们函数>>=(通常称为“bind”),它的类型为(>>=) :: Promise a -> (a -> Promise b) -> Promise b。这类似于then,其中回调返回另一个Promise,在原始Promise 之后排序。

【讨论】:

【解决方案2】:

忽略类型类,我们在 Haskell 中有以下类型(我们会说拥有正确的 Haskell 类型类对应于在 JavaScript 中拥有合适的 .then 方法):

fmap :: (a -> b) -> f a -> f b
bind :: (a -> f b) -> f a -> f b

在 JavaScript 中我们有(组成语法):

.then :: (this :: f a) -> (a -> (b || f b)) -> f b

所以在某种意义上它们是等价的,但在另一种意义上却不是。例如,假设在 Haskell 中有一种叫做 P 的承诺类型,我们想从文件中读取一个 URL,然后给出一个获取该 URL 的承诺:

read :: String -> P String
fetch :: String -> P String
readFetch :: String -> P (P String)
readFetch file = fmap fetch (read file)

然后你可能会do:

fetched <- readFetch someFile
...
foo <- fetched

在 JavaScript 中,如果您使用 read(file).then(fetch),这将等同于以下 Haskell:

readFetch :: String -> P String
readFetch file = bind fetch (read file)

所以第一个只有在文件被读取后才会完成,而第二个会在获取完成后完成(即稍后)。

我们得出结论,thenfmap 相似但不完全相同。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多