如何在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是松散类型的,因此这可能会很快变得棘手。下面是一篇关于您正在尝试做什么的好文章: