İlk önce doğru ve yanlışın ne olduğunu ve ilk başta onlara ne anlam verdiğini inceleyelim.
lambda hesabında eğer bir then b else c olarak adlandırılan bir yapı oluşturabiliriz:
(\ifThenElse. <use if then else>)(\a. \b. \c. a b c)
JavaScript'te, Bu şöyle görünür:
(function(ifThenElse) {
// use ifThenElse
})(function(a) {
return function(b) {
return function(c) {
return a(b)(c);
};
};
});
ifThenElse'ın yararlı olması için, sağ veya solu seçen ve "true" seçeneğini seçerken bunu yapan "true" işlevine veya "true" seçeneğini seçmeyen "false" işlevine ihtiyacımız vardır.
Bu işlevleri şu şekilde tanımlayabiliriz:
(\true. <use true>)(\a. \b. a) and (\false. <use false>)(\a. \b. b)
JavaScript'te şöyle görünür:
(function(True) {
// use True
})(function(a) {
return function(b) {
return a;
}
});
(function(False) {
// use True
})(function(a) {
return function(b) {
return b;
}
});
şimdi aşağıdakileri yapabiliriz
(\true. \false. \ifThenElse. \doThis. \doThat. ifThenElse true doThis doThat)
(\a. \b. a)(\a. \b. b)(\a. \b. \c. a b c)(\a. ())(\a. ())
doThis ve doThat ile (\ a. ()) olmak, lambda hesabı yazdırma / matematik / dizeler gibi herhangi bir hizmet sunmadığından, yapabileceğimiz tek şey hiçbir şey yapmamak ve bunu yaptığımızı söylemek (ve daha sonra istediğimiz yan etkileri sağlayan sistemimiz)
yani bunu iş başında görelim.
(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");})();
Bu, birden fazla işleve ayırmak için diziler / haritalar / argümanlar / veya birden fazla ifadeyi kullanmamıza izin verildiğinde basitleştirilebilen derin bir ortam, ancak tutmak istiyorum, kendimi tam olarak bir argümanın işlevleriyle sınırlayabildiğim kadar saf sadece.
True / False adının doğal bir önemi olmadığını fark ederseniz, bunları kolayca evet / hayır, sol / sağ, sağ / sol, sıfır / bir, elma / portakal olarak yeniden adlandırabiliriz. Hangi seçim yapılırsa yapılsın bunun sadece seçicinin yaptığı türden kaynaklanması önemlidir. Eğer "SOL" basılırsa, seçicinin sadece doğru olabileceğini biliyoruz ve bu bilgiye dayanarak daha sonraki kararlarımıza rehberlik edebiliriz.
Özetlemek gerekirse
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');
})();