2016-06-06 2 views
5

Изучив теорию категории, основанную на книгах MacLane, Awodey и Spivak, я пытаюсь понять свободную/оперативную монаду в Haskell.Coyoneda и производящий functor в Haskell

Мы можем получить монаду только от типа данных, используя Control.Monad.Free после преобразования его в функтор с Data.Functor.Coyoneda, который основан на математическом фоне под названием Yoneda lemma.

Но я не совсем понимаю, что функтор может быть автоматически сгенерирован производным расширением функтора в GHC вместо того, чтобы полагаться на лемму Йонеды.

Есть ли ограничение использовать производящий функтор в GHC по сравнению с Data.Functor.Coyoneda?

+0

Возможно, вы найдете [этот блогпост] (https://oleksandrmanzyuk.wordpress.com/2013/01/18/co-yoneda-lemma/) полезным – Carsten

ответ

8

Хороший вопрос!

Coyoneda и DeriveFunctor делать разные вещи. Coyoneda создает новый отдельный тип данных, который является Functor для любого выбора аргумента. DeriveFunctor просто генерирует код шаблона для типов, которые являются функторами сами по себе. Вы можете получить только экземпляр Functor для типов, для которых вы могли бы написать такой экземпляр вручную.

Возьмите newtype Pred a = Pred (a -> Bool) как (несколько надуманный), например: нет instance Functor Pred, потому что Pred контравариантен в параметре a, так DeriveFunctor не сможет помочь вам. С другой стороны, Coyoneda Pred является Functor, поскольку Coyoneda f является Functor, хотя и не очень полезным, для любых f.

В качестве альтернативы Freer monad возникает как приложение от Free до Coyoneda.

+0

Является ли 'Coyoneda Pred' почти изоморфным или эквивалентным в некотором смысле на 'Const()'? Вы не сможете извлечь какую-либо информацию из любого из них ... – chi

+1

@chi Да, полагаю, так. Вы можете изготовить 'Coyoneda Pred' из ничего, выбрав« Void »как экзистенциально квантифицированный тип' b' внутри: 'Coyoneda absurd absurd :: forall a. Coyoneda Pred a'. Тогда тривиально построить оба направления изоморфизма. –

+0

@BenjaminHodgson, если использовать 'DeriveFunctor' вместе с' StandaloneDeriving', типичный тип данных, похоже, может стать функтором, не используя возможности 'Coyoneda', верно? Я знаю имя Freer Monad, но пока не понимаю. – sato

Смежные вопросы