Розуміння, чому Блискавка - це Комонад


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

7
На ваше запитання дуже складно відповісти у форматі SO ... але ви абсолютно правильні. Блискавки, орієнтовані на елементи, завжди є комондами.
Дж. Абрахамсон

4
Список також може розглядатися як comonad так само добре (декількома способами), тоді як блискавка може бути представлена ​​як монада (також багато в чому). Різниця полягає в тому, чи ви концептуально орієнтовані на "приєднання" даних конструктивно до державної машини (саме про це йде інтерфейс Monad), або "вилучення" стану з нього "деконструктивно" (саме це робить Comonad). Відповісти на це питання непросто, сказане як "чи має таке розуміння сенс". У певному сенсі це так, в іншому - ні.
КТ.

2
Для того, щоб передати щось у комонаду, потрібно забезпечити дві операції: 1) Вилучення значення (наприклад, це може бути головою списку) та 2) Застосування операції з обробки списку (наприклад, ви можете застосувати це в розсувному режимі) віконний спосіб уздовж списку, або елементарно або подібне, якщо припустиме, що відповідне перетворення одиниці не змінить список). Чи має такий спосіб обробки списку якийсь сенс - це окреме питання. Зауважте, що голий інтерфейс комонад не дає ані способу побудови списку, ані його переходу. Він знає лише, як споживати відомості про список.
КТ.

2
@eenblam Ви маєте рацію. Я додам відповідь, і це питання вилучить із списку без відповіді, сподіваюсь
Майкл

Відповіді:


1

Оскільки це запитання регулярно з'являється у верхній частині списку "без відповіді", дозвольте мені просто скопіювати свій коментар як відповідь тут - нічого значно конструктивнішого не з'явилося з року тому в будь-якому випадку.

A Listможе розглядатися як comonad так само добре (по-різному), тоді як a Zipperможе бути представлений як монада (також багато в чому). Різниця полягає в тому, чи ви концептуально орієнтовані на "додавання" даних конструктивно до машини машини (саме про це Monadінтерфейс), або "вилучення" стану з нього "деконструктивно" (саме це і Comonadробиться).

Відповісти на це питання непросто, сказане як "чи має таке розуміння сенс". У певному сенсі це так, в іншому - ні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.