Я пытаюсь грок комбинаторов, поэтому я написал основные c единицы: K
и S
в Typescript:
const K: Kestrel = a => b => a;
const S: Starling = a => b => c => a(c)(b(c));
Затем я следовал статье в Википедии о логических логиках SKI c:
TRUE = K
FALSE = SK
поэтому:
const TRUE: True = K;
const FALSE = S(K);
И это проходит базовые c тесты:
const t = () => true;
const f = () => false;
test('Ktf = (TRUE)tf = t', () => {
const actual = TRUE(t)(f)();
expect(actual).toBe(K(t)(f)());
expect(actual).toBe(true);
});
test('SKxy = y', () => {
expect(S(K)(t)(f)()).toBe(false);
expect(FALSE(t)(f)()).toBe(false);
});
Пока все хорошо, но когда дело доходит до NOT
Википедия говорит:
NOT = (FALSE)(TRUE) = (SK)(K)
(TRUE)NOT = TRUE(FALSE)(TRUE) = FALSE
(FALSE)NOT = FALSE(FALSE)(TRUE) = TRUE
Я написал код и тесты и получил:
const NOT = S(K)(K);
test('(TRUE)NOT = FALSE', () => {
expect(TRUE(NOT)(t)(f)()).toBe(false); // <- see these () after (t)(f)?
expect(TRUE(NOT)(f)(t)()).toBe(true);
});
test('(FALSE)NOT = TRUE', () => {
expect(FALSE(NOT)(t)(f)).toBe(true); // <- here we don't have these ()
expect(FALSE(NOT)(f)(t)).toBe(false);
});
Мой вопрос касается двух строк, которые я выделил комментариями: зачем проходить тесты, мне нужна эта асимметрия между TRUE
и FALSE
? Похоже, я следовал всем деталям в реализации K
и S
, но в случае TRUE(NOT)(t)(f)
я получаю функцию () => false
, а в случае FALSE(NOT)(t)(f)
я получаю false
.
Есть ли какие-то детали, которые я пропустил, или Википедия недостаточно точна в определениях?
PS: Вот код: https://repl.it/repls/FuchsiaFuchsiaTruetype