ก่อนอื่นมาตรวจสอบว่าความจริงและเท็จคืออะไรและอะไรที่ให้ความหมายตั้งแต่แรก
เราสามารถสร้างโครงสร้างที่เรียกว่าถ้าเป็นแล้ว b อื่น c ในแคลคูลัสแลมบ์ดาดังต่อไปนี้:
(\ifThenElse. <use if then else>)(\a. \b. \c. a b c)
ใน JavaScript ดูเหมือนว่านี้:
(function(ifThenElse) {
// use ifThenElse
})(function(a) {
return function(b) {
return function(c) {
return a(b)(c);
};
};
});
เพื่อให้ ifElse มีประโยชน์เราต้องใช้ฟังก์ชัน "true" ที่เลือกทั้งขวาหรือซ้ายและทำในขณะที่ไม่สนใจตัวเลือกอื่นหรือฟังก์ชัน "false" ที่เลือกตัวเลือก "true" จะไม่ใช้
เราสามารถกำหนดฟังก์ชั่นเหล่านี้ได้ดังต่อไปนี้:
(\true. <use true>)(\a. \b. a) and (\false. <use false>)(\a. \b. b)
ใน JavaScript ดูเหมือนว่านี้:
(function(True) {
// use True
})(function(a) {
return function(b) {
return a;
}
});
(function(False) {
// use True
})(function(a) {
return function(b) {
return b;
}
});
ตอนนี้เราสามารถทำสิ่งต่อไปนี้
(\true. \false. \ifThenElse. \doThis. \doThat. ifThenElse true doThis doThat)
(\a. \b. a)(\a. \b. b)(\a. \b. \c. a b c)(\a. ())(\a. ())
ด้วย doThis และ doThat being (\ a. ()) เนื่องจาก lambda แคลคูลัสไม่ได้ให้บริการใด ๆ เช่นการพิมพ์ / คณิตศาสตร์ / สตริงทั้งหมดที่เราสามารถทำได้คือทำอะไรและพูดว่าเราทำมัน (และโกงในภายหลังโดยแทนที่ด้วยบริการใน ระบบของเราที่ให้ผลข้างเคียงที่เราต้องการ)
ดังนั้นเราจะเห็นสิ่งนี้ในการดำเนินการ
(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");})();
นั่นเป็นสภาพแวดล้อมที่ลึกที่สามารถทำให้ง่ายขึ้นถ้าเราได้รับอนุญาตให้ใช้อาร์เรย์ / แผนที่ / การโต้แย้ง / หรือมากกว่าหนึ่งคำสั่งเพื่อแยกออกเป็นฟังก์ชั่นหลายอย่าง แต่ฉันต้องการที่จะเก็บไว้บริสุทธิ์เท่าที่ฉันสามารถ จำกัด ตัวเอง เท่านั้น
โปรดสังเกตว่าชื่อจริง / เท็จไม่มีความสำคัญโดยธรรมชาติเราสามารถเปลี่ยนชื่อเป็นใช่ / ไม่ใช่ซ้าย / ขวาขวา / ซ้ายศูนย์ / หนึ่งแอปเปิ้ล / ส้ม มันมีความสำคัญในสิ่งที่เลือกทำมันเกิดจากชนิดของผู้เลือกเท่านั้น ดังนั้นหากพิมพ์ "ซ้าย" เรารู้ว่าตัวเลือกอาจเป็นจริงได้และจากความรู้นี้เราสามารถแนะนำการตัดสินใจของเราเพิ่มเติม
ดังนั้นเพื่อสรุป
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');
})();