Я проверил возможность дублирования вопроса, и не может найти точное решение.
Я написал код функциональной цепочки в JavaScript, как показано ниже, и отлично работает.
var log = function(args)
{
console.log(args)
return function(f)
{
return f;
};
};
(log('1'))(log('2'))(log('3'))(log('4'));
//1
//2
//3
//4
Я хочу сделать эту ленивую оценку.
Или для создания функции.
var log = function(args)
{
var f0 = function()
{
return console.log(args);
};
return function(f1)
{
return function()
{
f0();
return f1;
};
};
};
var world = (log('1'))(log('2'))(log('3'))(log('4'));
console.log(world);
//should be just a function,
// but in fact
//1
//[function]
world();
//should be
//1
//2
//3
//4
// but in fact
// 2
Что-то очень не так. Вы можете исправить это?
Спасибо.
Этот вопрос разрешен, но есть еще
проблема async, как показано в обсуждении комментариев
Когда мы имеем
// unit :: a -> IO a
var unit = function(x)
{
return function()
{
return x;
};
};
// bind :: IO a -> (a -> IO b) -> IO b
var bind = function(x, y)
{
return function()
{
return y(x())();
};
};
// seq :: IO a -> IO b -> IO b
var seq = function(x, y)
{
return function()
{
return x(), y();
};
};
var action = function(x)
{
return function(y)
{
return y ? action(seq(x, y)) : x();
};
};
var wrap = function(f)
{
return function(x)
{
return action(function()
{
return f(x);
});
};
};
var log = wrap(console.log);
// -- runtime --
// HACK: when `world` is modified by passing a function,
// the function will be executed.
Object.defineProperties(window,
{
world:
{
set: function(w)
{
return w();
}
}
});
Мы также часто нуждаемся в асинхронных цепных реакциях.
var asyncF = function(callback)
{
setTimeout(function()
{
for (var i = 0; i < 1000000000; i++)
{
};
callback("async process Done!");
}, 0);
};
var async = wrap(asyncF(function(msg)
{
world = log(msg);
return msg;
}));
Теперь,
world = (log(1))(async)(log(3));
//1
//3
//async process Done!
До сих пор приятно и плавно, теперь мы пытаемся использовать bind
world = (log(1))
(bind((async), (log(x))));
//should be
//1
//async process Done!
//3
//in fact
//ReferenceError: x is not defined
Не могли бы вы изменить эту работу, пожалуйста?
еще один < <26 > несколько значений
Я не понимаю
// seq :: IO a -> IO b -> IO b
var seq = function(x, y)
{
return function()
{
return x(), y();
};
};
как автор библиотеки упоминает
Обратите внимание, что это невозможно в Haskell, потому что одна функция не может вернуть два результата. Кроме того, по моему скромному мнению, это выглядит уродливо.
Я согласен и не знаю, что это за
return x(), y();
многократное возвращаемое значение.
Я искал Google и искал здесь, но не смог найти ответ.
Что это такое?
(на всякий случай, я выберу этот хак для синтаксиса)
Спасибо!