Pertama mari kita periksa apa yang benar dan salah dan apa yang memberi mereka arti di tempat pertama.
kita dapat membangun struktur yang disebut jika a maka b selain c dalam kalkulus lambda sebagai berikut:
(\ifThenElse. <use if then else>)(\a. \b. \c. a b c)
Dalam JavaScript, Ini terlihat seperti ini:
(function(ifThenElse) {
// use ifThenElse
})(function(a) {
return function(b) {
return function(c) {
return a(b)(c);
};
};
});
agar ifThenElse bermanfaat, kita memerlukan fungsi "true" yang memilih kanan atau kiri, dan melakukan itu sambil mengabaikan opsi lain, atau fungsi "false" yang memilih opsi "true" tidak mengambil.
Kita dapat mendefinisikan fungsi-fungsi ini sebagai berikut:
(\true. <use true>)(\a. \b. a) and (\false. <use false>)(\a. \b. b)
dalam JavaScript terlihat seperti ini:
(function(True) {
// use True
})(function(a) {
return function(b) {
return a;
}
});
(function(False) {
// use True
})(function(a) {
return function(b) {
return b;
}
});
sekarang kita bisa melakukan hal berikut
(\true. \false. \ifThenElse. \doThis. \doThat. ifThenElse true doThis doThat)
(\a. \b. a)(\a. \b. b)(\a. \b. \c. a b c)(\a. ())(\a. ())
dengan doThis dan doThat being (\ a. ()) karena lambda calculus tidak menawarkan layanan apa pun seperti pencetakan / matematika / string, yang bisa kita lakukan adalah tidak melakukan apa-apa dan mengatakan kita telah melakukannya (dan kemudian menipu dengan menggantinya dengan layanan di sistem kami yang memberikan efek samping yang kami inginkan)
jadi mari kita lihat ini dalam aksi.
(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");})();
Itu adalah lingkungan yang dalam yang dapat disederhanakan jika kita diizinkan menggunakan array / peta / argumen / atau lebih dari satu pernyataan untuk dipecah menjadi beberapa fungsi, tetapi saya ingin tetap murni seperti saya dapat membatasi diri pada fungsi tepat satu argumen hanya.
perhatikan bahwa nama Benar / Salah tidak memiliki signifikansi yang melekat, kita dapat dengan mudah mengubah nama mereka menjadi ya / tidak, kiri / kanan, kanan / kiri, nol / satu, apel / jeruk. Ini memiliki arti penting dalam pilihan apa pun yang dibuat, itu hanya disebabkan oleh jenis pemilih yang membuatnya. Jadi jika "KIRI" dicetak, kita tahu bahwa pemilih hanya bisa benar, dan berdasarkan pengetahuan ini kita dapat memandu keputusan kita selanjutnya.
Jadi untuk meringkas
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');
})();