deniok: (Рыжий)
deniok ([personal profile] deniok) wrote2015-11-05 10:33 pm

Экспоненциальное офункторивание

Как вам скорее всего известно, написать представителя класса типов Functor для типа эндоморфизма невозможно. Если неизвестно, то можете попробовать
newtype Endo a = Endo (a -> a)

instance Functor Endo where
   fmap f (Endo g) = Endo undefined
Даже если ваш результат сойдется по типам, законам для функтора он удовлетворять не будет.

Вот вам другой экспоненциальный тип данных, для которого, однако, написать законного представителя класса типов Functor можно:
newtype Quest b a = Quest ((a -> b) -> a)

instance Functor (Quest b) where
  fmap f (Quest g) = Quest undefined
Попробуйте сделать это, после чего ответьте на вопрос: чему равен результат такого вызова
> let Quest f = fmap succ $ Quest (\h -> h 40) in f id

[identity profile] deni-ok.livejournal.com 2015-11-05 08:39 pm (UTC)(link)
Бифунктор по-кметтовски ковариантен по обоим параметрам. А (->) - это профунктор. Хотя это все вопрос терминологии.

[identity profile] nponeccop.livejournal.com 2015-11-05 08:56 pm (UTC)(link)
ошибся. Профунктор, конечно