【问题标题】:Maybe monad in JavaScript也许 JavaScript 中的 monad
【发布时间】:2015-03-09 13:47:33
【问题描述】:

在 monads.maybe on npm 的示例中,我们有:

function find(collection, predicate) {
  for (var i = 0; i < collection.length; ++i) {
    var item = collection[i]
    if (predicate(item))  return Maybe.Just(item)
  }
  return Maybe.Nothing()
}

有人能解释一下Maybe.Just(item);Maybe.Nothing() 到底在做什么吗?

换一种说法; monad 本质上是用作实现特定接口的返回值的对象,这些接口可以定义一系列函数调用吗?

【问题讨论】:

  • Have you read this stuff? 我认为这仅在该系统的上下文中才有意义。
  • 你自己当然知道了,但也许 monad 只是定义了函数组合在可能不返回结果的计算上下文中的含义。或更笼统地说:Monad 定义了不同计算上下文中组合的语义。

标签: javascript monads


【解决方案1】:

Maybe 用于表示可能失败的操作。

在这个函数的例子中,如果一个元素满足谓词,则返回Just(the element),否则返回Nothing以表明它“失败”(在这种情况下,没有元素满足谓词) .

最好只返回 null,因为返回类型明确表明它可能会失败,并且答案可以与模式匹配。

【讨论】:

  • 谢谢。请您确认以下几点:monad 本质上是用作返回值的对象吗,这些对象实现了特定接口,从而能够定义一系列函数调用?
  • 这不是一个糟糕的定义;我认为它比您的定义所暗示的更基于数学。与其关注 monad 一词来弄清楚它们,不如看看它们的不同示例。 Either 类型与 Maybe 类似,但失败类型还包括错误标识符,因此您知道出了什么问题。然后是用于纯粹维护状态的 State monad。查找一篇将 Monads 与乐器进行比较的文章(我不记得我在哪里看到的)。它对 Monads 有很好的讨论。
【解决方案2】:

Monad 是带有 API 的抽象容器,用于对其中包含的数据进行操作。在Option monad 的实例中,我认为它是giftbox,它要么有礼物,要么是空的。将您的数据包装在Maybe.Just() 中表示该容器确实包含数据,同时它将返回值维护为Maybefind() 方法的调用者可以这样做:

var userPredicate = function(user) { return user.name === 'billy bob'; };
var users = collections.getUsersCollection();

var maybeData = find(users, userPredicate);
if(maybeData.isJust()) {
    // there was data...do something with it
} else {
    // no data...do something else
}

另一方面,Maybe.Nothing() 表示没有数据(上例中的 else 部分)。理想情况下,您可以像这样将数据包装在:var maybeData = Maybe(data) 中,然后对其进行操作、传递等等。这是向任何接收此对象的人发出的信号,他们需要有意识地处理丢失数据的情况。

披露:我正在开发一个名为 Giftbox 的类似库,它具有更丰富的 API。查看那里的自述文件以获得更多解释,以帮助您了解 Option monad 是什么以及如何有效地使用它。

Here's an article 描述可能对您有用的 Monad、Applicative 和 Functor。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2019-02-03
    • 1970-01-01
    • 2012-08-05
    • 2012-03-02
    • 2014-01-10
    相关资源
    最近更新 更多