Комонади: зриваючи покрови із суті ООП

Mar 03, 2013 02:48

Я колись читав, що існує такий звір, як комонади, і навіть пам’ятав, що це таке, але чисто теоретично. Ця ж стаття дуже свіжо зриває усі покрови із глибинної комонадності ООП:
http://www.haskellforall.com/2013/02/you-could-have-invented-comonads.html

Зокрема, було дійсно цікаво, коли в голові щось клацнуло і комонади:

class Functor w => Comonad w where
extract :: w a -> a - дуально до return
duplicate :: w a -> w (w a) - дуально до join
extend :: (w a -> b) -> w a -> w b - дуально до bind
справді ототожнились із об’єктами ООП: extract став своєрідним аксесором, який дістає нутрощі об’єкта, extend став «застосовувачем» «методів» (w a -> b). Потім елегантний фокус автора:

(#) :: a -> (a -> b) -> b
x # f = f x
infixl 0 #
і застосування методів стало дуже ООП-шним:

object # method1 # method2 arg1 arg2

Втім, треба ще дочитати, не втерпів, щоб не поділитись раніше. Можливо, що знайдуться критичні відмінності між об’єктами та комонадами, ще не зрозуміло. Хто із досвідчених читачів блогу уже стикався з комонадами і що може сказати з їх приводу?

Якщо ООП справді формулюється в термінах комонад, то тоді і об’єктно-орієнтована сторона Скали може бути математично визначена, і те, що мене від неї відлякувало (неформалізованість ООП) перестає бути страшним.

Кроспост із G+

haskell, crosspost

Previous post Next post
Up