javascript - 成语描述效果的可能性

标签 javascript functional-programming idioms

有时我需要编写一个可能有效果也可能没有效果的函数。

是否有功能(或其他)成语来描述这种情况?前缀 maybe 描述了它,但是有什么惯用的东西吗?

例如:

function maybe(guardCb) {
  return function(cb) {
    return function() {
      if(guardCb.apply(this, arguments)) {
        return cb.apply(this, arguments);
      }
    }
  };
}

function isFoo(args) {
  return args.isFoo();
}

function doSomething(args) {
  return foo.bar(args.bam);
}

maybe(isFoo)(doSomething)(args);

我知道 maybe monad,但它似乎与此不同。

最佳答案

这只是一个纯函数。等效的 Haskell 代码是:

maybe :: (a -> Bool) -> (a -> b) -> a -> Maybe b
maybe p f x = if p x then Just (f x) else Nothing

example = maybe p f x

这个函数没有特殊的名称。但是,它可以简化:

maybe :: Bool -> b -> Maybe b
maybe b y = if b then Just y else Nothing

example = (maybe <$> p <*> f) x

注意 p::a -> Boolf::a -> bmaybe p f::a -> Maybe b 都有一个共同点(即 ((->) a))。这是 Reader接口(interface),可以使用 Applicative 将其抽象出来类型类,这就是我所做的。

但是,这不是好的代码。更好的抽象是:

maybe :: (a -> Maybe b) -> (b -> c) -> a -> Maybe c
maybe p f = fmap f . p

注意 p::a -> Maybe b 现在是 Kleisli arrow而不是简单的谓词函数。我们已将条件逻辑移出 maybe 函数。在 JavaScript 中,您的代码现在将是:

isFoo(args).map(doSomething);

您需要做的就是定义一个Maybe 数据类型并实现它的Functor 接口(interface):

function Maybe(constructor) {
    this.constructor = constructor || this;
}

var Nothing = new Maybe;

function Just(value) {
    var maybe = new Maybe(Just);
    maybe.value = value;
    return maybe;
}

Maybe.prototype.map = function (functor) {
    switch (this.constructor) {
    case Nothing: return Nothing;
    case Just:    return Just(functor(this.value));
    }
};

当然,你还需要重新定义isFoo如下:

function isFoo(args) {
    return args.isFoo() ? Just(args) : Nothing;
}

doSomthing 函数可以保持原样。希望对您有所帮助。

您正在寻找的成语是一个 Functor 接口(interface)。

关于javascript - 成语描述效果的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33167502/

相关文章:

clojure - 在 Clojure 中解构命令的惯用方法

c++ - 我应该如何将一个值插入另一个的 "middle"?

ruby - 是否有教程教授经验丰富的程序员使用的常见 Ruby 编程习语,但对新手来说可能并不明显?

javascript - Django javascript 文件

javascript - 从指令模板内访问 Angular 的 rootScope

javascript - 将 SCSS 变量导出到 JS(自动循环变量)

javascript - 在 Javascript 的工作线程中阻塞异步调用

javascript - 在 HTML 中使用 PHP 文件

ios - 为什么我不能在 Swift 中重新分配实例方法?

javascript - 如何使用 setTimeout 和 Promise 使这段 JS 代码更实用?