【问题标题】:Idiom to describe possibility of effect描述效果可能性的成语
【发布时间】:2016-01-15 00:44:28
【问题描述】:

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

是否有一个功能性(或其他)成语来描述这种事态?前缀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);

我知道可能单子,但它似乎与此不同。

【问题讨论】:

  • 就我而言,我会把doSomething()被调用的条件写到函数名中。
  • 您在寻找命名约定还是编程技术?
  • 我想的编程技术。我有兴趣以“功能”样式实现条件。

标签: javascript functional-programming idioms


【解决方案1】:

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

correctPossibleError()

handlePossibleNameChange()

erasePossibleOuterCircle() 

includePossibleMatches()

【讨论】:

    【解决方案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 -&gt; Boolf :: a -&gt; bmaybe p f :: a -&gt; Maybe b 都有一个共同点(即((-&gt;) a))。这是Reader 接口,可以使用Applicative 类型类抽象出来,这就是我所做的。

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

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

    请注意,p :: a -&gt; 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 接口。

    【讨论】:

    • 这个专业领域的名称是什么?语言理论?你是从 Haskell 那里学到的还是在学术上学到的?
    • 这是category theory,数学的一个分支。范畴论概括了数学。但是,它在编程中也很有用(用于泛化各种常见接口,如FunctorMonad)。因此,它在 Haskell 中被广泛使用,并且在学习 Haskell 时会学到很多类别理论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2017-02-20
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多