Почему, когда вы определяете функцию duplicate
duplicate :: w a -> w (w a)
для comonad typeclass (ссылка) вам нужно изменить все элементы "в контексте" (т.е. изменить элементы, отличные от текущее значение контекста). Почему бы просто не использовать что-то вроде return в Monad?
Пример (молния):
data Z a = Z [a] a [a]
почему я не могу просто определить дубликат как
duplicate z = Z [] z []
Я попытался получить требование для функции duplicate из правил Comonad, но я всегда получаю дубликат, который просто обертывает элемент, похожий на return в монады без необходимости делать что-либо еще.
Один сообщение в блоге говорит:
дублировать немного сложнее. Из заставки на молнии нам нужно создать список молний из списка молний. Значением этого (подтвержденным законами comonad, которые должен выполнять каждый экземпляр) является то, что перемещение внутри дублированной структуры возвращает исходную структуру, измененную тем же движением
Но я не понимаю, почему так должно быть. fmap в правилах Comonad всегда применяется к обернутому элементу, а затем этот один элемент всегда "разворачивается" с помощью extract, зачем беспокоиться о чем-либо еще в дублирующем элементе , кроме как просто перенос аргумента duplicate?
Можете ли вы указать, что я пропустил? Я чувствую, что где-то я сделал какую-то очевидную ошибку, но я просто не могу понять это сам.
Заранее благодарим за ответы!