假设你有一个数字数组xs:
[10, 5, 12, 7]
你需要通过两种方式对其进行改造:
xs.map(x => x % 2 == 0 ? x + 1 : x + 2);
//=> [11, 7, 13, 9]
xs.map(x => x % 2 == 0 ? x + 10 : x + 20);
//=> [20, 25, 22, 27]
我很快就会承认三元表达式可能还不错,但为了回答这个问题,我将它们设为pointfree:
const ifelse = (p, t, f) => x => p(x) ? t(x) : f(x);
const add = a => x => a + x;
const even = x => x % 2 == 0;
xs.map(ifelse(even, add(1), add(2)));
//=> [11, 7, 13, 9]
xs.map(ifelse(even, add(10), add(20)));
//=> [20, 25, 22, 27]
现在假设我们只想返回'even' 或'odd':
xs.map(ifelse(even, () => 'even', () => 'odd'));
//=> ['even', 'odd', 'even', 'odd']
两个 lambda 的行为方式相同:它们完全忽略 x 并且 总是 返回相同的值。这正是 Kestrel 组合器的意义所在:
const K = a => x => a;
xs.map(ifelse(even, K('even'), K('odd')));
//=> ['even', 'odd', 'even', 'odd']