И кажется мне, что конструкт new Promise(...).then(...).then(...).then(...) очень похож на do-блок в Хаскелле, а сам метод Promise.prototype.then — на >>= (т.е. монадный bind) в оном же Хаскелле.
Мне приглючилось, или я угадал?
Можно ли в Хаскелле написать аналог промиса с использованием монад?
MSS>Вот читаю книжицу по JavaScript. MSS>И кажется мне, что конструкт new Promise(...).then(...).then(...).then(...) очень похож на do-блок в Хаскелле, а сам метод Promise.prototype.then — на >>= (т.е. монадный bind) в оном же Хаскелле. MSS>Мне приглючилось, или я угадал? MSS>Можно ли в Хаскелле написать аналог промиса с использованием монад?
похоже на то
(я ненастоящий сварщик, пользовался только рабоче-крестьянским IO)
Здравствуйте, Maxim S. Shatskih, Вы писали:
MSS>Вот читаю книжицу по JavaScript.
MSS>И кажется мне, что конструкт new Promise(...).then(...).then(...).then(...) очень похож на do-блок в Хаскелле, а сам метод Promise.prototype.then — на >>= (т.е. монадный bind) в оном же Хаскелле.
MSS>Мне приглючилось, или я угадал?
MSS>Можно ли в Хаскелле написать аналог промиса с использованием монад?
Сигнатуру функции приведи! Далеко не все, кто знает Haskell, знают JavaScript. Например, я уже 100 лет не писал на последнем.
А так, монады — это настолько общее свойство, что очень много где они встречаются. Просто название не очень удачное, не попсовое, слишком наукообразное, а в наше время это не ценится.
Здравствуйте, koenig, Вы писали:
D>>И на монаду Future из Rust тоже!
K>о, а вот и человек попался. эти знания были приобретены на работе?
Нет, в свободное время. Там функция and_then и есть монадическая связка. Есть ли return, надо глянуть, но думаю, его можно нарисовать. Так то, монадическую связку больше принято называть flat_map, как для тех же итераторов в Rust, но вот во futures-rs почему-то вот так назвали. Для примера в Scala монадическая связка тоже flatMap называется, а вот в F# как Bind. Ну, а в Haskell ее шифруют как (>>=), как некоторые знают
Я не так давно открыл для себя Rust. Просто удивительный язык! И без сборщика мусора. При этом позволяет выражать такие высокоуровневые вещи как монады. Поразительно! Ничего подобного нигде больше не видел.
D>А так, монады — это настолько общее свойство, что очень много где они встречаются. Просто название не очень удачное, не попсовое, слишком наукообразное, а в наше время это не ценится.
Вполне попсовое, просто начинающим сложно бывает понять, какие практические задачи удобно решать с их помощью.
D>Хотя бы приблизительное описание типов. Где что возвращается. Так, коллбэки что возвращают? Промисы или просто void?
Имеем:
new Promise(InitPath)
.then(Lambda1)
.then(Lambda2)
Лямбды с одним параметром и возвращают 1 значение — либо промис, либо не-промис.
Если Lambda1 возвращает не-промис, то получается Lambda2(Lambda1(ResolveObjectOfFirstPromise)) после завершения первого промиса. Т.е. возврат из 1 становится параметром 2.
А вот если Lambda1 возвращает промис SecondPromise, то тогда Lambda2 позовется только по завершению SecondPromise с ее параметром завершения.
Не знаю, как это сделано на уровне движка, знаю только, что все эти лямбды зовутся только в цикле простоя интерпретатора — т.е. кидаются в очередь и потом разбираются из нее.
Могу предположить, что then создает новый промис и ставит его как "дочерний" для первоначального промиса (своего this). А далее завершение промиса, если оно вернуло не-промис, завершает дочернего.
Если же вернуло промис, то очень может быть, что дочерний убивается, а его содержимое (лямбда и ссылка на его дочернего) перекладывается в SecondPromise.
Здравствуйте, Maxim S. Shatskih, Вы писали:
D>>Хотя бы приблизительное описание типов. Где что возвращается. Так, коллбэки что возвращают? Промисы или просто void?
MSS>Имеем: MSS> new Promise(InitPath) MSS> .then(Lambda1) MSS> .then(Lambda2)
MSS>Лямбды с одним параметром и возвращают 1 значение — либо промис, либо не-промис.
Вот когда возвращает промис, то работает как обычная монадическая связка. Ну, а если возвращает не-промис, то это больше похоже на то, что продолжение возвращает не обычный промис, а тот, который получился бы после применения функции return. По всем признакам монада, хотя интерфейс немного нестандартный.
Здравствуйте, Maxim S. Shatskih, Вы писали:
MSS>Вот читаю книжицу по JavaScript.
MSS>И кажется мне, что конструкт new Promise(...).then(...).then(...).then(...) очень похож на do-блок в Хаскелле, а сам метод Promise.prototype.then — на >>= (т.е. монадный bind) в оном же Хаскелле.
MSS>Мне приглючилось, или я угадал?
MSS>Можно ли в Хаскелле написать аналог промиса с использованием монад?
Это всего лишь одна конкретная монада — continuation. Монад разных великое множество.
Здравствуйте, Maxim S. Shatskih, Вы писали:
MSS>И кажется мне, что конструкт new Promise(...).then(...).then(...).then(...) очень похож на do-блок в Хаскелле, а сам метод Promise.prototype.then — на >>= (т.е. монадный bind) в оном же Хаскелле.
MSS>Мне приглючилось, или я угадал? MSS>Можно ли в Хаскелле написать аналог промиса с использованием монад?
Монада Task
Если долго втыкать в императивный язык, то там можно обнаружить не только все монады, но и ко-монады