Что означает класс типа 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 за этот пример!)

Другие вопросы по тегам