Trước tiên, hãy xem xét điều gì đúng và sai và điều gì mang lại cho chúng ý nghĩa ngay từ đầu.
chúng ta có thể xây dựng một cấu trúc được gọi là nếu a thì b khác c trong phép tính lambda như sau:
(\ifThenElse. <use if then else>)(\a. \b. \c. a b c)
Trong JavaScript, nó trông như thế này:
(function(ifThenElse) {
// use ifThenElse
})(function(a) {
return function(b) {
return function(c) {
return a(b)(c);
};
};
});
để ifThenElse trở nên hữu ích, chúng ta cần một hàm "true" chọn bên phải hoặc bên trái và thực hiện điều đó trong khi bỏ qua tùy chọn khác hoặc chức năng "false" chọn tùy chọn "true" không thực hiện.
Chúng ta có thể định nghĩa các chức năng này như sau:
(\true. <use true>)(\a. \b. a) and (\false. <use false>)(\a. \b. b)
trong JavaScript nó trông như thế này:
(function(True) {
// use True
})(function(a) {
return function(b) {
return a;
}
});
(function(False) {
// use True
})(function(a) {
return function(b) {
return b;
}
});
bây giờ chúng ta có thể làm như sau
(\true. \false. \ifThenElse. \doThis. \doThat. ifThenElse true doThis doThat)
(\a. \b. a)(\a. \b. b)(\a. \b. \c. a b c)(\a. ())(\a. ())
với do This và doThat (\ a. ()) vì tính toán lambda không cung cấp bất kỳ dịch vụ nào như in / math / chuỗi, tất cả những gì chúng ta có thể làm là không làm gì và nói rằng chúng ta đã làm điều đó (và sau đó gian lận bằng cách thay thế nó bằng các dịch vụ trong hệ thống của chúng tôi cung cấp các tác dụng phụ mà chúng tôi muốn)
vì vậy hãy xem điều này trong hành động.
(function(True) {
return (function(False) {
return (function(ifThenElse) {
return (function(doThis) {
return (function(doThat) {
return ifThenElse(True)(doThis)(doThat);
});
});
});
})
})(function(a) {
return function(b) {
return a;
}
})(function(a) {
return function(b) {
return b;
}
})(function(a) {
return function(b) {
return function(c) {
return a(b)(c);
};
};
})(function(a) { console.log("you chose LEFT!"); })
(function(a) {console.log("you chose RIGHT");})();
Đó là một môi trường sâu có thể được đơn giản hóa nếu chúng ta được phép sử dụng mảng / ánh xạ / đối số / hoặc nhiều hơn một câu lệnh để phân chia thành nhiều hàm, nhưng tôi muốn giữ thuần túy như tôi có thể giới hạn bản thân trong các hàm của chính xác một đối số chỉ có.
Lưu ý rằng tên Đúng / Sai không có ý nghĩa cố hữu, chúng ta có thể dễ dàng đổi tên chúng thành có / không, trái / phải, phải / trái, không / một, táo / cam. Nó có ý nghĩa ở chỗ bất cứ sự lựa chọn nào được thực hiện, nó chỉ được gây ra bởi loại người chọn nó. Vì vậy, nếu "TRÁI" được in, chúng tôi biết rằng người chọn chỉ có thể đúng và dựa trên kiến thức này, chúng tôi có thể hướng dẫn các quyết định tiếp theo của mình.
Vì vậy, để tóm tắt
function ChooseRight(left) {
return function _ChooseRight_inner(right) {
return right;
}
}
function ChooseLeft(left) {
return function _ChooseLeft_inner(right) {
return left;
}
}
var env = {
'0': ChooseLeft,
'1': ChooseRight,
'false': ChooseRight,
'true': ChooseLeft,
'no': ChooseRight
'yes': ChooseLeft,
'snd': ChooseRight,
'fst': ChooseLeft
};
var _0 = env['0'];
var _1 = env['1'];
var _true = env['true'];
var _false = env['false'];
var yes = env['yes'];
var no = env['no'];
// encodes church zero or one to boolean
function lambda_encodeBoolean(self) {
return self(false)(true);
}
// decodes a Boolean to church zero or one
function lambda_decodeBoolean(self) {
console.log(self, self ? env['true'] : env['false']);
return self ? env['true'] : env['false'];
}
lambda_decodeBoolean('one' === 'two')(function() {
console.log('one is two');
})(function() {
console.log('one is not two');
})();
lambda_decodeBoolean('one' === 'one')(function() {
console.log('one is one');
})(function() {
console.log('one is not one');
})();