var NatToChurch = function (n) {
return n == 0 ? Zero : function (f) {
return function (x) {
return f(NatToChurch(n - ChurchToNat(Succ(Zero)))(f)(x));
};
};
};
var ChurchToNat = function (n) {
return n(function (x) {
return x + 1;
})(0);
};
с вот таким:
natToChurch 0 = \f -> id
natToChurch n = \f -> f . (natToChurch (n - 1))
churchToNat f = f (+1) 0
то выбор очевиден, несмотря на какие-либо наличия имён
Вопроса «зачем так делать?» нет. Есть вопрос «зачем так делать на языке, который для этого вообще не предназначен?», на haskell'е те же функции выглядели бы сильно проще.
Я бы сказал, что Gradle является прекрасным до тех пор, пока не начнёшь его использовать и не поймёшь, что сборка проекта, занимающая в Ant'е 2 секунды, может занять в Gradle (в основном, конечно, всякие инициализации) до 30 секунд.
$ touch ./-a
$ ls
-a
$ rm -rf * .[^.]* ..?*
zsh: sure you want to delete all the files in /home/dginzburg/tmp/rmtest [yn]? y
rm: invalid option -- 'a'
Try 'rm ./-a' to remove the file ‘-a’.
Try 'rm --help' for more information.
Собственно, сайт предназначен для малопонятного и нелогичного кода. Этот, может быть, и логичен, но никак не понятен. Суть в том, что незачем писать посты в 3 строки, не твиттер.
По поводу screen — это стрельба из пушки по воробьям. Если вам нужно просто запустить процесс и чтобы он не умер после выхода из ssh- (например) сессии, пользуйтесь nohup.
Вот, почитайте: en.wikibooks.org/wiki/Haskell/Fix_and_recursion
с вот таким:
то выбор очевиден, несмотря на какие-либо наличия имён
Не используйте массив длиной 1. Для таких случаев существует потокобезопасный
AtomicInteger
, который можно и изменять и декрементировать атомарно.fold
, зато корректно работает в busybox.