成语描述效果的可能性

时间:2015-10-16 09:54:22

标签: 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);

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

2 个答案:

答案 0 :(得分:2)

这只是一个纯粹的功能。等效的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接口,它可以使用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接口:

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界面。

答案 1 :(得分:0)

我认为“可能”这个词适合暗示功能的效果。

correctPossibleError()

handlePossibleNameChange()

erasePossibleOuterCircle() 

includePossibleMatches()