如何在javascript中使用函子

如何在javascript中使用函子,javascript,Javascript,给定一个类型为a的函数,我需要应用返回类型为b的函数z。基本上: z -> f(a) -> f(b) 这里有一个更具体的例子。这是一个函数,它接受一个字符串并返回一组使用该字符串的方法: # f(a) _typeCheck = (str) -> isArray: -> str is TYPES.ARRAY 我想将此函数转换为: # f(b) _typeCheck = -> isArray: (str) -> str is TYPES.ARR

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

z -> f(a) -> f(b)
这里有一个更具体的例子。这是一个函数,它接受一个字符串并返回一组使用该字符串的方法:

# f(a)
_typeCheck = (str) ->
    isArray: -> str is TYPES.ARRAY
我想将此函数转换为:

# f(b)
_typeCheck = ->
    isArray: (str) -> str is TYPES.ARRAY
执行此操作的功能是什么?请帮忙

注意


我在这里尝试使用函数式编程概念。Haskell具有修改类型构造函数以接受不同类型的函子。我相信类似的概念会帮助我解决问题。阅读更多

第一个问题是有一个采用“类型”的函数。JavaScript是松散类型的,因此任何类型强制都是如此

也就是说,您可以定义一个返回另一个函数的函数,如下所示:

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'));
如果您正在寻找一个返回函数映射以检查类型的函数,那么您可以使用如下模式:

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'));

我不知道Haskell,但在JS中,您可以构建如下内容:

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'));
//定义一些函子
list=xs=>a2b=>xs.map(a2b);
树=t=>a2b=>
T{
x:a2b(t.x),
树(t.le)(a2b),
ri:tree(t.ri)(a2b)
}
:null;
也许=x=>a2b=>x?a2b(x):x;
//给任何函子加五
add5=f=>f(x=>x+5);
//让我们测试一下
myTree={
x:1,
乐:{
x:2,
le:{x:3},
ri:{x:4}
},
ri:{x:4}
};
myList=[10,11,12,13];
log=x=>document.write(“”+JSON.stringify(x,0,3)+”);
日志([
增补5(可能(22)),
Add 5(可能(未定义)),
Add 5(列表(myList)),
地址5(树(myTree))

]);“函子”的?我敢打赌你来自C++后台。哈斯克尔,你能弄清楚你的类型吗?JavaScript是松散类型的,因此这可能会很快变得棘手。下面是一篇关于您正在尝试做什么的好文章: