Fluture:如何使用 Monad 解决空值处理问题

Fluture: how should null handling get addressed using Monads

我是函数式编程的新手,我发现以下 fluture 函数式编程示例似乎为处理数据库查询和后续数据操作提供了一个非常好的示例。然而,需要注意的是,在阅读函数式编程概念时,Just/Nothing monad 似乎是处理 null 检查的建议方法。 1) 这将如何适合这个例子和 2) 如果 findOne 被拒绝,它会停止来自 运行 的后续链并立即转到分叉吗?

import Future from 'fluture';

const processAll = Future.fork(_sendError, _sendResponse);

const _fetchFromDB =
    encaseP(userId => myModel.findOne({ id: userId }).exec())
  //Future.fromPromise(userId => myModel.findOne({ id: userId }).exec())

processAll(_fetchFromDB(userId)
  .chain(getDataGeneric)
  .chain(_findDevice)
  .chain(_processRequest))

我从下面的 Whosebug link 得到了这个例子,并将 fromPromise 修改为 encaseP:

我假设在将 Promise 转换为 Future 的示例中,encaseP 会替换 fromPromise。

实际上,Maybe (Nothing | Just) 往往不是你想要的处理错误的方法,因为虽然它可以帮助你缩短后续操作并给你一个提供默认值的钩子,但它不会告诉你为什么计算无法完成。

Either (Left | Right) 为您提供相同的功能,但还允许您访问导致流程采用错误分支的上下文,因为 Left 也保存数据,如错误消息,这很有用用于从错误中恢复、记录或向用户显示有用的消息。

Fluture 给你一个异步 Either。因为它是异步的,所以您不能直接检索值(就像您习惯使用 Promises 一样),但除此之外它的行为与 Maybe/Either 相同:fork 等同于 fold。你会得到短路和更多(比如改变轨道,映射到拒绝分支等)。

这里介绍的很好https://dev.to/avaq/fluture-a-functional-alternative-to-promises-21b