将根据值执行函数的函数。功能编程

时间:2017-10-01 18:46:31

标签: javascript functional-programming

我有两个函数,它们根据if语句执行。 E.g:

if(value) {
    doA()
} else {
    doB()
}

如何编写将获取结果的函数或对象,并决定是否执行每个函数。我想收到这样的话:

exists(result).doA()
nothing(result).doB()

我想在JavaScrit中学习一些函数式编程,所以我很欣赏任何可以用JavaScript学习FP的源代码。

3 个答案:

答案 0 :(得分:1)

延续传球风格

这是使用continuation passing style的方法。您会注意到main的实现与原始编码相差不远 -  一旦你完成了这个问题,如果你还没有了解monads,你现在知道最好的一个(cont)^ _ ^

// cont :: a -> (a -> b) -> b
const cont = x =>
  k => k (x)
  
// when :: (a -> boolean, a -> b, a -> b) -> a -> (a -> b) -> b
const when = (f,l,r) => x =>
  f (x) ? cont (l (x)) : cont (r (x))

// isOdd :: number -> boolean  
const isOdd = x =>
  x & 1 === 1
  
// doA :: number -> number    
const doA = x =>
  x + 1

// doB :: number -> number
const doB = x =>
  x * x

// main :: number -> void
const main = x =>
  cont (x) (when (isOdd, doA, doB)) (console.log)
  
main (3) // IO: 4,  doA (3) === 3 + 1
main (4) // IO: 16, doB (4) === 4 * 4

数据构建器

这是使用简单数据构造函数LeftRight来表示Fork sum type的另一种方法 - 这会产生一种data-directed样式,其中{{1}的控件由输入类型

决定

main

答案 1 :(得分:0)

你可以写这样的东西,例如:

function exists(value) {
    return function (func) {
        if (value !== undefined) {
            return func(value);
        }
        return null;
    }
}

function nothing(value) {
    return function (func) {
        if (value === undefined) {
            return func();
        }
        return null;
    }
}

function doA(value) {
    console.log('doing A', value);
}

function doB() {
    console.log('doing B');
}

const foo = 'fool';
const bar = undefined;

exists(foo)(doA);
nothing(bar)(doB);

exists 函数获取一个值并返回另一个函数。返回的函数获取另一个函数作为参数,执行如果定义了传递的值。

我在上面的示例中使用了“老派”匿名函数,以便更容易理解。使用ES6箭头功能,您可以更加巧妙地编写 exists nothing 功能,如下所示:

function exists(value) {
    return func => value !== undefined ? func(value) : null;
}

function nothing(value) {
    return func => value === undefined ? func(value) : null;
}

当您意识到可以通过将公共代码放在另一个函数中来重构这两个函数时,“函数编程乐趣”真正开始,然后用于创建两个函数,如下所示:

function executeWithCondition(predicate) {
    return value => func => predicate(value) ? func(value) : null;
}

const exists = executeWithCondition(value => value !== undefined);
const nothing = executeWithCondition(value => value === undefined);

此技术称为 currying

这些功能的用法仍然相同:

exists(foo)(doA);
nothing(bar)(doB);

这是完整的可运行代码示例:



function executeWithCondition(predicate) {
    return value => func => predicate(value) ? func(value) : null;
}

const exists = executeWithCondition(value => value !== undefined);
const nothing = executeWithCondition(value => value === undefined);

function doA(value) {
    console.log('doing A', value);
}

function doB() {
    console.log('doing B');
}

const foo = 'fool';
const bar = undefined;

exists(foo)(doA);
nothing(bar)(doB);




答案 2 :(得分:0)

一种方法是定义具有设置为函数

的值的对象的属性

const o = {
  exists: function(value) {
    return value ? this.doA() : this.doB()
  },
  doA: function(value) {
    console.log("A")
  },
  doB: function(value) {
    console.log("B")
  }
}

o.exists(void 0);