Что означает класс типа Extend в Haskell?
В Haskell есть класс типов, называемый Extend.
Класс определяется как следующий
class Functor w => Extend w where
extended :: (w a -> b) -> w a -> w b
Каждый экземпляр Extend
Класс должен иметь следующие свойства:
extended f . extended g = extended (f . extended g)
Я вижу его сходство с Functor
, В частности, Functor
собственность fmap f . fmap g == fmap (f . g)
выглядит как Extend
,
Как бы вы истолковали Extend
? Каково значение этого? Это облегчает какие-либо вычисления? Какие абстракции делаются при использовании Extend
?
1 ответ
Extend
это Comonad
без возможности extract
, Это "почти комонада", если вы хотите так думать об этом. Вероятно, более полезно задать вопрос "в чем смысл комонад". Затем, когда вы найдете что-то, что почти комонада, вы знаете, что можете использовать Extend
представлять это. Я рекомендую Neighborhood of Infinity для ознакомления с примерами комонад.
У нас есть похожая вещь для Monad
а также Applicative
, Кстати. Bind
является Monad
но без return
, а также Apply
является Applicative
но без pure
, Вы можете найти оба этих класса в одном semigroupoids
пакет вы связали.
Например, непустые списки образуют комонаду с duplicate = tails
а также extract = head
, затем extend f = fmap f . duplicate
, Это хорошо, если у нас есть NonEmpty
, но если список может быть пустым, extract = head
больше не полная функция. У нас все еще есть duplicate
а также extend
, так []
может быть Extend
но это не может быть Comonad
, (Спасибо @phadej за этот пример!)