Seja um CCC . Deixe ser um produto em bifunctor . Como Cat é CCC, podemos curry :
A categoria de funções possui estrutura monoidal usual. Um monóide em é um mônade em . Consideramos produtos finitos como a estrutura monoidal em .
Portanto preserva a estrutura monoidal, portanto transporta um monóide para uma mônada e um comonóide para uma comonada. Ou seja, ele transporta um monóide arbitrário para mônada (veja a definição - deve ser um monóide). Da mesma forma, transporta o comonóide diagonal para a comonada de Coreader.
Agora, por concretude, desdobro a construção do Writer.
Início. Na verdade , eles simplesmente têm nomes distintos em Haskell. Temos um monóide Haskell :
O Writer é um functor, portanto deve mapear também morfismos, como e . Eu escrevo isso como abaixo, embora seja inválido em Haskell:
é uma transformação natural, um morfismo em . Por propriedades do , é uma função que recebe e fornece um morfismo em :
Informalmente, o soma componentes do tipo bombeia intacto. Esta é exatamente a definição de Writer em Haskell. Um obstáculo é que, para a Mônada ⟨ W r i t e r w , μ , r | ⟩ Precisamos
ou seja, incompatibilidade de tipos. Mas esses functores são isomórficos: pelo associador usual de produtos finitos, que é um isomorfismo natural . Em seguida, definimos via . Eu omito a construção de via .
O Writer, sendo um functor, preserva diagramas comutativos, ou seja, preserva as igualidades monóides, por isso temos garantido igualdades comprovadas para = um monóide em = uma mônada em . Fim.
E o Reader e o Cowriter? O Reader é adjacente ao Coreader, conforme explicado na definição de Coreader, veja o link acima. Da mesma forma, o Cowriter é adjacente ao Writer. Como não encontrei uma definição de Cowriter, criei-a por analogia mostrada na tabela:
{- base, Hackage.category-extras -}
import Control.Comonad
import Data.Monoid
data Cowriter w a = Cowriter (w -> a)
instance Functor (Cowriter w) where
fmap f (Cowriter g) = Cowriter (f . g)
instance Monoid w => Copointed (Cowriter w) where
extract (Cowriter g) = g mempty
instance Monoid w => Comonad (Cowriter w) where
duplicate (Cowriter g) = Cowriter
(\w' -> Cowriter (\w -> g (w `mappend` w')))
Abaixo estão as definições simplificadas dessas (co) mônadas. fr_ob F indica um mapeamento de um functor F em objetos, fr_mor F indica um mapeamento de um functor F em morfismos. Existe um objecto monóide em .
- Escritor
- Leitor
- Coreader
- Cowriter
A questão é que a adjunção em relaciona functores, não mônadas. Não vejo como a adjunção implica "Coreader é uma comonada" "Reader é uma mônada" e "Writer é uma mônada" "Cowriter é uma comonada".
Observação. Estou lutando para fornecer mais contexto. Requer algum trabalho. Especialmente, se você precisar de pureza categórica e essas (co) mônadas foram introduzidas para programadores. Continue importunando! ;)
Respostas:
Sim, se uma mônada tiver um N adjacente correto , N herdará automaticamente uma estrutura de comonada.M:C→C N N
O cenário teórico geral da categoria para entender isso é o seguinte. Sejam e D duas categorias. Faça F u n ( C , D ) para a categeory de functors de C para D ; Seus objetos são functores e seus morfismos transformações naturais. Faça F u n G ( C , D ) para a subcategoria completo de F u n ( C , D )C D Fun(C,D) C D FunL(C,D) Fun(C,D) nos functores que possuem adjuntos corretos (em outras palavras, consideramos os functores com adjuntos corretos e transformações naturais arbitrárias entre eles). Faça F R : D → C para o adjunto direito de um functor F : C → D . Em seguida, - R : F u n G ( C , D ) → F u n ( D , C ) é um funtor contravariante: se α : F →C→D FR:D→C F:C→D −R:FunL(C,D)→Fun(D,C) é uma transformação natural, em seguida, existe uma transformação induzida naturais α R : G R → F R .α:F→G αR:GR→FR
Se , em seguida, F u n ( C , C ) tem uma estrutura monoidal dada pela composição e o mesmo acontece com F u n G ( C , D ) , porque a composição de adjuntos esquerda é um adjunto esquerdo. Especificamente, ( F G ) R = G R F R , então - R é um função contravariante antimonoidal. Se você aplicar - R às transformações naturais estruturais que equipam um functor MC=D Fun(C,C) FunL(C,D) (FG)R=GRFR −R −R M com a estrutura de uma mônada, o que você ganha é uma comonada.
fonte
A propósito, isso:
está um pouco incorreto. Por um lado, a terminologia usual seria (se não me engano) que é um bifunctor sobre ou em C . "In" normalmente significa construções usando as setas e objetos de uma categoria, enquanto que os functors "on" categorias se referem a construções relacionadas a várias categorias. E o bifuncor de produto não é uma construção dentro de uma categoria cartesiana.× C
E isso está relacionado à maior imprecisão: a capacidade de curry o bifunctor do produto não tem nada a ver com sendo fechado cartesiano. Pelo contrário, é possível porque C a t , a categoria de categorias (advertências de inserção) é fechada cartesiana. Portanto, o curry em questão é dado por:C Cat
onde é um produto de categorias, e E D é a categoria de functors F : D → E . Isso funciona independentemente de C , D e E serem fechados cartesianos, no entanto. Quando deixamos C = D = E , obtemos:C×D ED F:D→E C D E C=D=E
c u r r y × : C → C C
Mas este é apenas um caso especial de:
c u r r y F : C → E D
fonte
Considere a adjunção . Para cada tal adjunção temos uma mônada ⟨ G F , η , G ε F ⟩ e também um comonad ⟨ F G , ε , F η G ⟩ . Notavelmente, F e G não precisam ser endofuncionais e, em geral, não são (por exemplo, a mônada da lista é um complemento entre os funções livres e esquecidas entre S e t e M o n⟨F,G,ϵ,η⟩ ⟨GF,η,GϵF⟩ ⟨FG,ϵ,FηG⟩ F G Set Mon )
Então, o que você quer fazer é pegar o Reader (ou o Writer) e decompô-lo nos functores adjacentes que dão origem à mônada e à comonada correspondente. O que significa que a conexão entre o Reader e o Coreader (ou o Writer e o Cowriter) não é a que você está procurando.
E provavelmente é melhor pensar em currying como , ou seja, ∀ X , Y . { f : X × A → Y } ≅ { f ∗ : X → Y A } . Ou, se ajudar, - ∗ : hom ( - × A ,−∗:hom(−×A,=)≅hom(−,=A) ∀X,Y. {f:X×A→Y}≅{f∗:X→YA} −∗:hom(−×A,=×1)≅hom(−1,=A)
fonte