Що таке клас класу Comonad у Haskell?


105

Що таке клас класу Comonad у Haskell? Як і в Comonad від Control.Comonad у пакеті comonad (пояснення будь-яких інших пакетів, які надають клас класу Comonad, також вітаються). Я розпливчасто чув про Комонаду, але все, що я насправді знаю про це, є те, що це забезпечує extract :: w a -> a, якась паралель монаді return :: a -> m a.

Бонусні бали за відмітку "реального життя" використання Comonad у "реальному" коді.


Я дуже хотів би побачити, яка різниця між "co" і нормальним. Я знаю, що таке монада. Тож якщо я знаю, що означає "спів", я можу зробити сам висновок, що таке комода, і глибоко зрозуміти це. Відповідь Олексія Романова в цьому аспекті нічого не зробила.
Evi1M4chine

2
@ Evi1M4chine: "co" (вільно) означає "перевернути стрілки". Ось приблизна візуальність цього. Розглянемо монадійні операції: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Поміняйте хвилясті стрілки , і ви отримаєте comonadic операції: extract :: a <~ w a, extend :: (a <~ w b) -> (w a <~ w b)( extract :: w a -> a, extend :: (w a -> b) -> w a -> w b)
Ден Бертон

Дякую @Dan Burton ... тож, будучи з монадою, ти працюєш надворі "(набиваєш нові та змінені речі), з comonad, ти працюєш над" зовні "(виймаючи речі нарешті або просто змінюючи їх) . Чи правильний цей погляд? Тому що, безумовно, дуже допомагає глибоке розуміння.
Evi1M4chine

комони можна використовувати для моделювання ко-ефектів. Ось чудовий вступ до коефіцієнтів: tomasp.net/coeffects
zeronone

Відповіді:


83

Ці посилання можуть бути корисними:

  1. Оцінка стільникових автоматів є комонадною . Зокрема, "щоразу, коли ви бачите великі структури даних, складені з безлічі невеликих, але подібних обчислень, є хороший шанс, що ми маємо справу з комонадою".
  2. Послідовності, потоки та відрізки
  3. Комони у повсякденному житті

1
+1 Першим посиланням було те, що насправді зблизило мене.
luqui

42
Відповідь лише для посилань повинна містити, принаймні, короткий виклад пов'язаного вмісту. В даний час ця відповідь не підходить для того, щоб бути гарною відповіддю. Спробуйте розширити його трохи, щоб він міг стояти самостійно без пов'язаних статей.
Бакуріу

3
"кожного разу, коли ви бачите великі структури даних, зібрані разом з безлічі невеликих, але схожих обчислень, є хороший шанс, що ми маємо справу з комонадою" .... Так це означає, що шейдери фрагментів є комонадними?
Сем Келлетт

Я знайшов цей приклад з , extendщоб бути корисним.
Кріс Пеннер

22

Це не відповідає в повній мірі на моє запитання, але я хотів поставити деяку відповідну інформацію у форматі відповідей:

"co" (вільно) означає "перевернути стрілки". Ось приблизна візуальність цього.

Розглянемо монадійні операції:

return :: a ~> m a
flip (>>=) :: (a ~> m b) -> (m a ~> m b)

Зворотними виразними стрілками ви отримаєте спільні операції:

extract :: a <~ w a
extend :: (a <~ w b) -> (w a <~ w b)

(Написано звичайними стрілками)

extract :: w a -> a
extend :: (w a -> b) -> w a -> w b

Зверніть увагу, як у цьому форматі return- стрілка, яка так само вписується у слот для аргументів flip (>>=), і те саме стосується extractі та extend. Монада / комонада закони говорять , що коли ви поклали returnабо extractв цей слот, в результаті особистості стрілок. Закони ті самі, "тільки зі стрілками перевернуті". Це надзвичайно зручна відповідь, але, сподіваємось, вона дає деяке розуміння.


2
Ваша відповідь добре поєднується з тим, щоб уникнути помилок підручника. Монади (і комони) - це лише інтерфейс. Хоча справді було б чудово знати, як вони призначені . Як у: Ідея, що стоїть за ними.
Evi1M4chine
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.