给定一个类型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
答案 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))
]);