布尔柯里化 Javascript
Boolean Currying Javascript
我正在尝试在 javascript 中编写布尔柯里化函数。
let s = "ajkjxa";
function isPresent(a) {
return function (b) {
if (b) {
return isPresent(s.includes(b) && s.includes(a));
} else {
return s.includes(a);
}
};
}
console.log(isPresent("a")("j")("x")());//true expected
console.log(isPresent("a")("j")("x")('b')());//false expected
如果传递的参数是给定的字符串,我希望 isPresent 函数应该 return true 否则它应该 return false。
我主要是作为学习练习来回答这个问题。经过一番努力后,我有了一些我知道有用的东西。我使用了与您的初始示例不同的语法和命名,并且我在设置调用中传递了初始字符串。
这可能不是严格意义上的“柯里化”,因为我们只需要聚合布尔值。似乎没有必要编译函数调用列表,因为布尔结果已经足够了。
如评论中所述,return在最后添加一个函数是不必要的,至少在纯 JS 中是这样。在我编写此代码的 TypeScript 中,我无法让类型以这种方式工作。 (return 类型取决于参数类型,如果那是 returned,则不能调用 (boolean | function)
。)
const startcurry = start => { // string
const results = []; // boolean[] (could be boolean instead)
function inner(maybeNext) { // string?
if (maybeNext) {
const next = maybeNext; // string (just for naming rule)
results.push(start.includes(next));
return inner;
}
return results.every(x => x);
}
return inner;
};
const s = "ajkjxa";
console.log(startcurry(s)("a")("j")("x")()); // true expected
console.log(startcurry(s)("a")("j")("x")('b')()); // false expected
console.log(startcurry(s)("a")("j")("x")('k')()); // true expected
console.log(startcurry(s)("a")("j")("x")('k')('c')()); // false expected
console.log(startcurry(s)()); // true expected
console.log(startcurry(s)("b")("a")()); // false expected
通用解决方案是以不同方式传入“累加器”值。您对 isPresent
的第一次调用应该已经调用了闭包,并且 isPresent()
也应该有效。
function makePresenceChecker(string, found) {
return function(char) {
if (char == undefined)
return found;
else
return makePresenceChecker(string, found && string.includes(char));
};
}
const isPresent = makePresenceChecker("ajkjxa", true);
console.log(isPresent("a")("j")("x")()); // true
console.log(isPresent("a")("j")("x")('b')()); // false
你也可以用 IIFE 来写:
const string = "ajkjxa";
const isPresent = (function makePresenceChecker(found) {
return function(char) {
if (char == undefined)
return found;
else
return makePresenceChecker(found && string.includes(char));
};
})(true);
console.log(isPresent("a")("j")("x")()); // true
console.log(isPresent("a")("j")("x")('b')()); // false
您可以更改它,使其每次都检查 'a',但递归调用 isPresent(b),如果它存在
let s = "ajkjxa";
function isPresent(a, valid=true) {
return function (b) {
let isValid = valid && s.includes(a);
if (b) return isPresent(b, isValid)
return isValid
};
}
console.log(isPresent("a")("j")("x")());//true expected
console.log(isPresent("a")("j")("x")('b')());//false expected
console.log(isPresent("a")("g")("l")());//false expected
console.log(isPresent("a")("s")("b")("b")());//false expected
console.log(isPresent("a")("s")("l")("a")());//false expected
编辑:移至默认参数,代码更少,适用于评论中的用例。
我正在尝试在 javascript 中编写布尔柯里化函数。
let s = "ajkjxa";
function isPresent(a) {
return function (b) {
if (b) {
return isPresent(s.includes(b) && s.includes(a));
} else {
return s.includes(a);
}
};
}
console.log(isPresent("a")("j")("x")());//true expected
console.log(isPresent("a")("j")("x")('b')());//false expected
如果传递的参数是给定的字符串,我希望 isPresent 函数应该 return true 否则它应该 return false。
我主要是作为学习练习来回答这个问题。经过一番努力后,我有了一些我知道有用的东西。我使用了与您的初始示例不同的语法和命名,并且我在设置调用中传递了初始字符串。
这可能不是严格意义上的“柯里化”,因为我们只需要聚合布尔值。似乎没有必要编译函数调用列表,因为布尔结果已经足够了。
如评论中所述,return在最后添加一个函数是不必要的,至少在纯 JS 中是这样。在我编写此代码的 TypeScript 中,我无法让类型以这种方式工作。 (return 类型取决于参数类型,如果那是 returned,则不能调用 (boolean | function)
。)
const startcurry = start => { // string
const results = []; // boolean[] (could be boolean instead)
function inner(maybeNext) { // string?
if (maybeNext) {
const next = maybeNext; // string (just for naming rule)
results.push(start.includes(next));
return inner;
}
return results.every(x => x);
}
return inner;
};
const s = "ajkjxa";
console.log(startcurry(s)("a")("j")("x")()); // true expected
console.log(startcurry(s)("a")("j")("x")('b')()); // false expected
console.log(startcurry(s)("a")("j")("x")('k')()); // true expected
console.log(startcurry(s)("a")("j")("x")('k')('c')()); // false expected
console.log(startcurry(s)()); // true expected
console.log(startcurry(s)("b")("a")()); // false expected
通用解决方案是以不同方式传入“累加器”值。您对 isPresent
的第一次调用应该已经调用了闭包,并且 isPresent()
也应该有效。
function makePresenceChecker(string, found) {
return function(char) {
if (char == undefined)
return found;
else
return makePresenceChecker(string, found && string.includes(char));
};
}
const isPresent = makePresenceChecker("ajkjxa", true);
console.log(isPresent("a")("j")("x")()); // true
console.log(isPresent("a")("j")("x")('b')()); // false
你也可以用 IIFE 来写:
const string = "ajkjxa";
const isPresent = (function makePresenceChecker(found) {
return function(char) {
if (char == undefined)
return found;
else
return makePresenceChecker(found && string.includes(char));
};
})(true);
console.log(isPresent("a")("j")("x")()); // true
console.log(isPresent("a")("j")("x")('b')()); // false
您可以更改它,使其每次都检查 'a',但递归调用 isPresent(b),如果它存在
let s = "ajkjxa";
function isPresent(a, valid=true) {
return function (b) {
let isValid = valid && s.includes(a);
if (b) return isPresent(b, isValid)
return isValid
};
}
console.log(isPresent("a")("j")("x")());//true expected
console.log(isPresent("a")("j")("x")('b')());//false expected
console.log(isPresent("a")("g")("l")());//false expected
console.log(isPresent("a")("s")("b")("b")());//false expected
console.log(isPresent("a")("s")("l")("a")());//false expected
编辑:移至默认参数,代码更少,适用于评论中的用例。