布尔柯里化 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

编辑:移至默认参数​​,代码更少,适用于评论中的用例。