如何在javascript中使用仿函数

时间:2016-02-04 23:54:02

标签: javascript

给定一个类型a的函数,我需要应用函数z,它返回一个类型为b的函数。基本上是:

z -> f(a) -> f(b)

这是一个更具体的例子。这是一个函数,它接受一个字符串并返回一组使用字符串的方法:

# f(a)
_typeCheck = (str) ->
    isArray: -> str is TYPES.ARRAY

我想将此功能转换为:

# f(b)
_typeCheck = ->
    isArray: (str) -> str is TYPES.ARRAY

执行此操作的函数z是什么?请帮忙。

注意

我试图在这里使用函数式编程概念。 Haskell有一些函数可以修改类型构造函数以采用不同的类型。我相信一个类似的概念可以帮助我解决我的问题。阅读更多here

2 个答案:

答案 0 :(得分:0)

第一个问题是拥有一个“类型”的函数。 JavaScript的输入类型很宽松,因此任何类型的执行will need to come from you

也就是说,你可以定义一个返回另一个函数的函数:

function factory(a) {
    // check typeof a
    return function(b) {
        // do something with a
        // check typeof b
    };
}

// invoke
var myNewFunction = factory("a string");
myNewFunction("another string");

如果您正在寻找一个函数来返回检查类型的函数映射,那么您可以使用这样的模式:

function _typeCheck() {
    return {
        isArray: function(o) {
            return Array.isArray(o);
        },
        isString: function(o) {
            return typeof o === 'string';
        },
        ...etc
    };
}
console.log(_typeCheck().isArray(['one','two']));
console.log(_typeCheck().isString('foo'));

答案 1 :(得分:0)

我不知道Haskell,但在JS中你可以构造这样的东西:

// define some functors

list = xs => a2b => xs.map(a2b);

tree = t => a2b =>
    t ? {
        x: a2b(t.x),
        le: tree(t.le)(a2b),
        ri: tree(t.ri)(a2b)
    }
        : null;

maybe = x => a2b => x ? a2b(x) : x;


// add five to any functor

add5 = f => f(x => x + 5);

// let's test

myTree = {
    x: 1,
    le: {
        x: 2,
        le: {x: 3},
        ri: {x: 4}
    },
    ri: {x: 4}
};

myList = [10, 11, 12, 13];

log = x => document.write('<pre>' + JSON.stringify(x, 0, 3) + "</pre>");

log([
  add5(maybe(22)),
  add5(maybe(undefined)),
  add5(list(myList)),
  add5(tree(myTree))
]);