Мне всегда нравилось следующее интуитивное объяснение силы монады относительно функтора: монада может менять форму;функтор не может.
Кстати, вам здесь не хватает тонкости.Ради терминологии я разделю Functor
в смысле Хаскелла на три части: параметрический компонент, определяемый параметром типа и управляемый fmap
, неизменяемые части, такие как конструктор кортежей в State
и «форма», как и все остальное, например, выбор между конструкторами (например, Nothing
против Just
) или части, включающие параметры другого типа (например, среда в Reader
).
Конечно, один Functor
ограничен функциями отображения по параметрической части.
A Monad
может создавать новые "формы" на основе значений параметрической части , которыепозволяет гораздо больше, чем просто изменение формы.Дублирование каждого элемента в списке или удаление первых пяти элементов приведет к изменению формы, но фильтрация списка требует проверки элементов.
По сути, именно так Applicative
помещается между ними - это позволяет комбинироватьформы и параметрические значения двух Functors
независимо друг от друга, не позволяя последним влиять на первое.
Я прав?Если так, есть ли способ выразить эту тонкость новичку в Haskell.Я хотел бы сделать мою любимую фразу «монады могут изменить форму», чуть более честной;если нужно.
Возможно, тонкость, которую вы здесь ищете, заключается в том, что вы ничего не меняете.Ничто в Monad
не позволяет явно связываться с формой.Он позволяет создавать новые фигуры на основе каждого параметрического значения и объединять эти новые фигуры в новую составную фигуру.
Таким образом, вы всегда будете ограничены доступными способами создания фигур.С полностью универсальным Monad
все, что у вас есть, это return
, который по определению создает любую необходимую форму, так что (>>= return)
является тождественной функцией.Определение Monad
говорит вам, что вы можете сделать, учитывая определенные виды функций;он не предоставляет эти функции для вас.