Понимание, почему Zipper - это Comonad

112

Это продолжение ответа на мой предыдущий вопрос.

Предположим , что мне нужно отобразить каждый элемент a:Aиз List[A]к b:Bс функцией def f(a:A, leftNeighbors:List[A]): Bи генерировать List[B].

Очевидно, я не могу просто вызвать mapсписок, но могу использовать застежку-молнию . Застежка-молния - это курсор для перемещения по списку. Он обеспечивает доступ к текущему элементу ( focus) и его соседям.

Теперь я могу заменить мой fс def f'(z:Zipper[A]):B = f(z.focus, z.left)и передать эту новую функцию f'для cobindметода Zipper[A].

Эти cobindработы , как это: он называет , что f'с застежкой - молнией, затем перемещает молнию, звонки f'с новым «переехавшим» молнией, перемещает молнию снова и так далее, и так далее ... пока молния не достигнет конца списка.

Наконец, cobindвозвращается новая застежка-молния типа Zipper[B], которую можно преобразовать в список, и проблема решена.

Теперь обратите внимание на симметрию между cobind[A](f:Zipper[A] => B):Zipper[B]и. bind[A](f:A => List[B]):List[B]Вот почему Listэто Monadи Zipperесть Comonad.

Имеет ли это смысл ?

Майкл
источник
1
Я не эксперт, но для меня это имеет смысл. Когда я читал ваше объяснение, меня осенило. Спасибо!
acjay 03
7
На ваш вопрос очень сложно ответить в формате SO ... но вы абсолютно правы. Застежки-молния, ориентированные на элементы, всегда комонады.
Дж. Абрахамсон
4
Список также можно рассматривать как комонаду (разными способами), в то время как Zipper можно использовать как монаду (также разными способами). Разница в том, сконцентрированы ли вы на концептуальном «добавлении» данных в конечный автомат (это то, о чем идет речь в интерфейсе Monad) или «извлечении» из него состояния «деконструктивно» (это то, что делает Comonad). Однако нелегко ответить на вопрос, сформулированный как «имеет ли это понимание смысл». В одном смысле да, в другом - нет.
КТ.
2
Чтобы преобразовать что-то в комонаду, вам необходимо выполнить две операции: 1) Извлечение значения (например, это может быть заголовок списка) и 2) Применение операции обработки списка (например, вы можете применить ее в скользящем режиме). оконным способом по списку или поэлементно или тому подобное, предполагая, что соответствующее преобразование единицы не изменит список). Имеет ли смысл такой способ обработки списка - отдельный вопрос. Обратите внимание, что чистый интерфейс comonad не предоставляет ни способа создания списка, ни его обхода. Он знает только, как использовать операции со списком.
КТ.
2
@eenblam Вы правы. Я добавлю ответ, и я надеюсь, что он
Майкл

Ответы:

1

Поскольку этот вопрос регулярно появляется в верхней части списка "неотвеченных", позвольте мне просто скопировать свой комментарий в качестве ответа здесь - в любом случае ничего более конструктивного с года назад не появилось.

A также Listможно рассматривать как комонаду (несколькими способами), в то время как a Zipperможно использовать как монаду (также разными способами). Разница заключается в том, сконцентрированы ли вы на концептуальном «добавлении» данных в конечный автомат (это то, о чем Monadидет речь в интерфейсе) или «извлечении» из него состояния «деконструктивно» (это то, что Comonadделает).

Однако нелегко ответить на вопрос, сформулированный как «имеет ли это понимание смысл». В одном смысле да, в другом - нет.

KT.
источник