Учитывая выражение:
[0,1..] >>= \i -> [i * 2]
В определении >>=
для List функция лямбда \i -> [i * 2]
отображается по аргументу списка через fmap, что приводит к списку списков [[0], [2]..]
. Поэтому >>=
необходимо сгладить результат, используя функцию соединения, чтобы вернуть список: [0, 2..]
Согласно этот источник: "... определение bind в терминах fmap и join работает для каждой монады m: ma >>= k = join $ fmap k ma
"
Итак, зачем нужно возлагать бремя возврата монады на функцию, поставляемую в → =? Почему бы просто не определить привязку так?
ma >>= k = fmap k ma
Таким образом, вам не нужно иметь дело с выравниванием результата.