JavaScript и Haskell: промисы и монады
От: Maxim S. Shatskih Россия  
Дата: 15.05.18 19:42
Оценка:
Вот читаю книжицу по JavaScript.

И кажется мне, что конструкт new Promise(...).then(...).then(...).then(...) очень похож на do-блок в Хаскелле, а сам метод Promise.prototype.then — на >>= (т.е. монадный bind) в оном же Хаскелле.

Мне приглючилось, или я угадал?

Можно ли в Хаскелле написать аналог промиса с использованием монад?
Занимайтесь LoveCraftом, а не WarCraftом!
Re: JavaScript и Haskell: промисы и монады
От: koenig  
Дата: 15.05.18 20:01
Оценка:
MSS>Вот читаю книжицу по JavaScript.
MSS>И кажется мне, что конструкт new Promise(...).then(...).then(...).then(...) очень похож на do-блок в Хаскелле, а сам метод Promise.prototype.then — на >>= (т.е. монадный bind) в оном же Хаскелле.
MSS>Мне приглючилось, или я угадал?
MSS>Можно ли в Хаскелле написать аналог промиса с использованием монад?

похоже на то
(я ненастоящий сварщик, пользовался только рабоче-крестьянским IO)
Re: JavaScript и Haskell: промисы и монады
От: dsorokin Россия  
Дата: 16.05.18 14:14
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

MSS>Вот читаю книжицу по JavaScript.


MSS>И кажется мне, что конструкт new Promise(...).then(...).then(...).then(...) очень похож на do-блок в Хаскелле, а сам метод Promise.prototype.then — на >>= (т.е. монадный bind) в оном же Хаскелле.


MSS>Мне приглючилось, или я угадал?


MSS>Можно ли в Хаскелле написать аналог промиса с использованием монад?


Сигнатуру функции приведи! Далеко не все, кто знает Haskell, знают JavaScript. Например, я уже 100 лет не писал на последнем.

А так, монады — это настолько общее свойство, что очень много где они встречаются. Просто название не очень удачное, не попсовое, слишком наукообразное, а в наше время это не ценится.
Re[2]: JavaScript и Haskell: промисы и монады
От: koenig  
Дата: 16.05.18 14:31
Оценка:
D>Сигнатуру функции приведи!

вот
Re[3]: JavaScript и Haskell: промисы и монады
От: dsorokin Россия  
Дата: 16.05.18 14:57
Оценка:
Здравствуйте, koenig, Вы писали:

D>>Сигнатуру функции приведи!


K>вот


Хотя бы приблизительное описание типов. Где что возвращается. Так, коллбэки что возвращают? Промисы или просто void?
Re[3]: JavaScript и Haskell: промисы и монады
От: dsorokin Россия  
Дата: 16.05.18 15:08
Оценка:
Но я думаю, что в любом случае это должно быть очень похоже на монаду Cont из Haskell, монаду Async из F# и монаду Future из Scala
Re[3]: JavaScript и Haskell: промисы и монады
От: dsorokin Россия  
Дата: 16.05.18 15:10
Оценка:
И на монаду Future из Rust тоже!
Re[4]: JavaScript и Haskell: промисы и монады
От: koenig  
Дата: 16.05.18 16:00
Оценка:
D>И на монаду Future из Rust тоже!

о, а вот и человек попался. эти знания были приобретены на работе?
Re[5]: JavaScript и Haskell: промисы и монады
От: dsorokin Россия  
Дата: 16.05.18 17:31
Оценка:
Здравствуйте, koenig, Вы писали:

D>>И на монаду Future из Rust тоже!


K>о, а вот и человек попался. эти знания были приобретены на работе?


Нет, в свободное время. Там функция and_then и есть монадическая связка. Есть ли return, надо глянуть, но думаю, его можно нарисовать. Так то, монадическую связку больше принято называть flat_map, как для тех же итераторов в Rust, но вот во futures-rs почему-то вот так назвали. Для примера в Scala монадическая связка тоже flatMap называется, а вот в F# как Bind. Ну, а в Haskell ее шифруют как (>>=), как некоторые знают
Re[5]: JavaScript и Haskell: промисы и монады
От: dsorokin Россия  
Дата: 16.05.18 18:05
Оценка:
Здравствуйте, koenig,

Я не так давно открыл для себя Rust. Просто удивительный язык! И без сборщика мусора. При этом позволяет выражать такие высокоуровневые вещи как монады. Поразительно! Ничего подобного нигде больше не видел.
Re[2]: JavaScript и Haskell: промисы и монады
От: Maxim S. Shatskih Россия  
Дата: 16.05.18 19:45
Оценка:
D>Сигнатуру функции приведи! Далеко не все, кто знает Haskell, знают JavaScript. Например, я уже 100 лет не писал на последнем.

В наше время JavaScript стал полноценным функциональным языком. Только lazy eval вроде как нету.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: JavaScript и Haskell: промисы и монады
От: Maxim S. Shatskih Россия  
Дата: 16.05.18 19:46
Оценка:
D>А так, монады — это настолько общее свойство, что очень много где они встречаются. Просто название не очень удачное, не попсовое, слишком наукообразное, а в наше время это не ценится.

Вполне попсовое, просто начинающим сложно бывает понять, какие практические задачи удобно решать с их помощью.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[4]: JavaScript и Haskell: промисы и монады
От: Maxim S. Shatskih Россия  
Дата: 16.05.18 19:55
Оценка:
D>Хотя бы приблизительное описание типов. Где что возвращается. Так, коллбэки что возвращают? Промисы или просто void?

Имеем:
new Promise(InitPath)
.then(Lambda1)
.then(Lambda2)

Лямбды с одним параметром и возвращают 1 значение — либо промис, либо не-промис.

Если Lambda1 возвращает не-промис, то получается Lambda2(Lambda1(ResolveObjectOfFirstPromise)) после завершения первого промиса. Т.е. возврат из 1 становится параметром 2.

А вот если Lambda1 возвращает промис SecondPromise, то тогда Lambda2 позовется только по завершению SecondPromise с ее параметром завершения.

Не знаю, как это сделано на уровне движка, знаю только, что все эти лямбды зовутся только в цикле простоя интерпретатора — т.е. кидаются в очередь и потом разбираются из нее.

Могу предположить, что then создает новый промис и ставит его как "дочерний" для первоначального промиса (своего this). А далее завершение промиса, если оно вернуло не-промис, завершает дочернего.

Если же вернуло промис, то очень может быть, что дочерний убивается, а его содержимое (лямбда и ссылка на его дочернего) перекладывается в SecondPromise.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[5]: JavaScript и Haskell: промисы и монады
От: dsorokin Россия  
Дата: 17.05.18 02:04
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

D>>Хотя бы приблизительное описание типов. Где что возвращается. Так, коллбэки что возвращают? Промисы или просто void?


MSS>Имеем:

MSS> new Promise(InitPath)
MSS> .then(Lambda1)
MSS> .then(Lambda2)

MSS>Лямбды с одним параметром и возвращают 1 значение — либо промис, либо не-промис.


Вот когда возвращает промис, то работает как обычная монадическая связка. Ну, а если возвращает не-промис, то это больше похоже на то, что продолжение возвращает не обычный промис, а тот, который получился бы после применения функции return. По всем признакам монада, хотя интерфейс немного нестандартный.
Re: JavaScript и Haskell: промисы и монады
От: jazzer Россия Skype: enerjazzer
Дата: 17.05.18 02:27
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

MSS>Вот читаю книжицу по JavaScript.


MSS>И кажется мне, что конструкт new Promise(...).then(...).then(...).then(...) очень похож на do-блок в Хаскелле, а сам метод Promise.prototype.then — на >>= (т.е. монадный bind) в оном же Хаскелле.


MSS>Мне приглючилось, или я угадал?


MSS>Можно ли в Хаскелле написать аналог промиса с использованием монад?


Это всего лишь одна конкретная монада — continuation. Монад разных великое множество.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: JavaScript и Haskell: промисы и монады
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.06.18 13:20
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

MSS>И кажется мне, что конструкт new Promise(...).then(...).then(...).then(...) очень похож на do-блок в Хаскелле, а сам метод Promise.prototype.then — на >>= (т.е. монадный bind) в оном же Хаскелле.


MSS>Мне приглючилось, или я угадал?

MSS>Можно ли в Хаскелле написать аналог промиса с использованием монад?

Монада Task

Если долго втыкать в императивный язык, то там можно обнаружить не только все монады, но и ко-монады
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.