Leitor, Mônadas de escritor


17

Seja um CCC . Deixe ser um produto em bifunctor . Como Cat é CCC, podemos curry :C(×)C(×)

curry(×):C(CC)

curry(×)A=λB.A×B

A categoria de funções possui estrutura monoidal usual. CC Um monóide em é um mônade em . CCC Consideramos produtos finitos como a estrutura monoidal em .C

curry(×)1id

A B.curry(×)(A×B)(curry(×)A)(curry(×)B)

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.(curry(×))w(Writer w)w

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 :Writer=Coreader=curry(×) w,mappend,mempty

mappend:w×ww

mempty:1w

O Writer é um functor, portanto deve mapear também morfismos, como e . Eu escrevo isso como abaixo, embora seja inválido em Haskell:mappendmempty

Writer mappend:Writer(w×w)Writer w

Writer mappend é uma transformação natural, um morfismo em . Por propriedades do , é uma função que recebe e fornece um morfismo em :CCcurry(×)aOb(C)C

Writer mappend a=mappend×(id(a)):Writer(w×w)aWriter w a

Informalmente, o soma componentes do tipo bombeiaWriter mappend aw intacto. Esta é exatamente a definição de Writer em Haskell. Um obstáculo é que, para a MônadaW r i t e r w , μ , r | PrecisamosaWriter w,μ,η

μ:Writer wWriter wWriter w

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 .Writer(w×w)=λa.(w×w)×aλa.w×(w×a)=Writer wWriter wμWriter mappendηmempty

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.Writer w,μ,η(CC)C

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:

texto alternativo

{- 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 .w,+^,0^C

  • Escritor
    • fr_ob(Writer w)a=a×w
    • fr_mor(Writer w)f=λa0,w2.a0,f w2
    • ηa=λa0.a0,0^
    • μa=λa0,w1,w0.a0,w0+^w1
  • Leitor
    • fr_ob(Reader r)a=ra
    • fr_mor(Reader r)f=λg r0.f(g r0)
    • ηa=λa0 r0.a0
    • μa=λf r0.f r0 r0
  • Coreader
    • fr_ob(Coreader r)a=r×a
    • fr_mor(Coreader r)f=λr0,a0.f r0,a0
    • ηa=λr0,a0.a0
    • μa=λr0,a0.r0,r0,a0
  • Cowriter
    • fr_ob(Cowriter w)a=wa
    • fr_mor(Cowriter w)f=λg r0.f(g r0)
    • ηa=λf.f 0^
    • μa=λf w1w0.f(w0+^w1)

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".C

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! ;)


Oferta: Você pode tirar uma captura de tela da tabela e colocar a imagem aqui.
MS Dousti 11/10/10

Você deve copiar a pergunta aqui.
Dave Clarke

2
as pessoas que fizerem voto negativo devem postar um comentário explicando o porquê.
Suresh Venkat

11
@Ohad. Confesso que apresentei essa alteração para tentar fornecer à pergunta mais contexto (como foi encontrado originalmente na postagem de blog originalmente referenciada). Eu acho que o beroal deveria gastar mais esforço para manter sua pergunta independente, por exemplo, definindo o que Reader, Writer, Coreader e Cowriter são em termos categóricos ou em Haskell ou em ambos, em vez de assumir que todos sabemos o que está sendo referido.
Dave Clarke

2
@beroal: O que eu quis dizer foi que, como eu não uso Haskell no dia a dia, analisar o código Haskell e fazer a transição para o CT não é trivial para mim e talvez para outros. Ao reformular a questão em termos puramente categóricos, que são mais propensos a receber uma resposta mais rápida ...
Ohad Kammar

Respostas:


13

Sim, se uma mônada tiver um N adjacente correto , N herdará automaticamente uma estrutura de comonada.M:CCNN

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 )CDFun(C,D)CDFunL(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 CDFR:DCF:CDR:FunL(C,D)Fun(D,C) é uma transformação natural, em seguida, existe uma transformação induzida naturais α R : G RF R .α:FGαR:GRFR

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=DFun(C,C)FunL(C,D)(FG)R=GRFRRRM com a estrutura de uma mônada, o que você ganha é uma comonada.


11
E deve-se mencionar que alguns desses functores, por exemplo não é realmente um functor, mas algo como um pseudo-functor, porque normalmente satisfaz a funcionalidade apenas até isomorfismos canônicos. No entanto, o ponto principal é válido. R
Andrej Bauer

7

A propósito, isso:

Deixe ser um produto em bifunctor C . Como C é CCC, podemos curry ( × )(×)CC(×)

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:CCat

HomCat(C×D,E)HomCat(C,ED)

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×DEDF:DECDEC=D=E

c u r r y × : C C C

×:C×CC
curry×:CCC

Mas este é apenas um caso especial de:

c u r r y F : C E D

F:C×DE
curryF:CED

2 Dan Doel: Sim, sim, obrigado. Cometi o erro ao traduzir a partir do post original beroal.livejournal.com/23223.html .
beroal 20/10/10

4

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 nF,G,ϵ,ηGF,η,GϵFFG,ϵ,FηGFGSetMon)

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×AY}{f:XYA}:hom(×A,=×1)hom(1,=A)


2 wren ng thornton: Não conheço nenhuma adjunção definidora para Reader e Writer semelhante à adjunção entre Set e uma categoria de estruturas algébricas. Ou você quer dizer que toda mônada é definida por uma adjunção como em "MacLane. Categorias para o matemático que trabalha. VI. Mônadas e álgebras. 2. Álgebras para uma mônada. Teorema 1 (Toda mônada é definida por suas álgebras T). "? Você pode ser mais específico? Na verdade, minha pergunta é a conclusão de uma tentativa de definir essas (co) mônadas em palavras elegantes como a mônada da lista.
beroal 20/10/10

T

F:SetMonU:MonSetη:idSetUFϵ:FUidMonF,U,η,ϵUF,η,UϵFSetMonFU,ϵ,FηU

Os Functors (Reader a) e (Writer a) são adjuntos, e essa adjunção dá origem à mônada (State a).
beroal

"Não, meu argumento era que mônadas e comônadas surgem" da mesma maneira ", nomeadamente através de uma adjunção, como descrito acima". Se você obtém a mônada e a comonada na adjunção entre as categorias Set e Mon, obtém a mônada em Set e a comonad em Mon - categorias diferentes. Mas Reader e Writer estão na mesma categoria do CCC.
beroal 25/10/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.