Я пытаюсь понять монады Хаскелла, читая "Монады для любознательного программиста" . Я столкнулся с примером списка Monad:
tossDie=[1,2,3,4,5,6]
toss2Dice = do
n <- tossDie
m <- tossDie
return (n+m)
main = print toss2Dice
Путь do
создает m
как список из 36 элементов, которые я разбираю, - он сопоставляет каждый элемент n
как список из 6 элементов, а затем объединяет эти списки. Я не понимаю, как n
изменяется при наличии m <- tossDie
, из 6 списков элементов в 36 элементов. Очевидно, что "мы сначала связываем n
, а затем связываем m
", здесь неправильно понимаем, но что правильно?
Я также не совсем понимаю, как применяется функция с двумя аргументами в блоке do
. Я подозреваю, что это случай клятвы, но я немного туманно о том, как именно он работает.
Может кто-нибудь объяснить эти две загадки?