2016-01-17 16 views
12

Bu denklemi X için çözebilir miyiz?Uygulamanın X'in ne için olduğunu anlamak için

Uygulamalı X bazı düşünce verdikten sonra

+3

'ComonadApply, Uygulamanın Monad'a uygulandığı şekliyle Comonad içindir. Http://hackage.haskell.org/package/comonad-4.2.7.2/docs/Control-Comonad.html#t:ComonadApply Görünmüyor Uygulamadan çok farklı olmak için ... – danidiaz

+1

bir cevap gibi geliyor! – nicolas

+3

@danidiaz Görüyorum ki '' ComonadApply'' '' Komonad'' olmalıdır - 'Monad's olmak zorunda değildir 'Uygulamanın' 'ın aksine. Bu benim için esas fark olarak görünüyor. – chi

cevap

5

comonad ne olduğunu Monad etmektir, bu aslında geri kalmış bir soru olduğunu düşünüyorum. Biri ComonadApply'un 'un Monad'a ne olduğunu düşünebilir, ancak durum böyle değildir. Ama bunu görmek, bize PureScript en typeclass hiyerarşisini kullanalım:

class Functor f where 
    fmap :: (a -> b) -> f a -> f b 

class Functor f => Apply f where 
    apply :: f (a -> b) -> f a -> f b -- (<*>) 

class Apply f => Applicative f where 
    pure :: a -> f a 

class Applicative m => Monad m where 
    bind :: m a -> (a -> m b) -> m b -- (>>=) 
-- join :: m (m a) -> m a 
-- join = flip bind id 

Gördüğünüz gibi, ComonadApply sadece (Apply w, Comonad w) => w olduğunu. Ancak, Applicative'un pure ile funkere değerler enjekte etme yeteneği gerçek farktır.

kategorik çift olarak Comonad tanımı return oluşur sitesindeki çift extract ve bind 'in ikili extend (vasıtasıyla da alternatif tanımı duplicate 'in ikili join gibi) hazırlanmıştır: Bu yüzden biz ise

class Functor w => Comonad w where 
    extract :: w a -> a   
    extend :: (w a -> b) -> w a -> w b 
-- extend f = fmap f . duplicate k 
-- duplicate :: w a -> w (w a) 
-- duplicate = extend id 

Monad için Applicative aşama bak arasında mantıklı bir adım olan bir typeclass olacaktır pure 'in ikili:

class Apply w => Extract w where 
    extract :: w a -> a 

class Extract w => Comonad w where 
    extend :: (w a -> b) -> w a -> w b 
Biz extend veya duplicate açısından extract tanımlayamazsınız, ne de biz bind veya join açısından pure/ return tanımlayabilirsiniz, bu nedenle bu "mantıklı" bir adım gibi görünüyor

Not. apply çoğunlukla burada ilgisiz; o kadar uzun onların yasalar devam ettiği sürece Extract veya Monad biri için tanımlanabilir:

applyC f = fmap $ extract f -- Comonad variant; needs only Extract actually (*) 
applyM f = bind f . flip fmap -- Monad variant; we need join or bind 

Yani Extract (değerler çıkıyorum) Monad için Comonad Ne Applicative (değerler alma) için olmasıdır. Apply yol boyunca az ya da çok mutlu küçük bir kaza. Hask'ta Extract, ancak Comonad (veya Extend değil, Comonad, aşağıya bakınız) türlerinin olup olmadığı ilginç olurdu, ama sanırım bunlar oldukça nadirdir.

Extract — henüz yok. Ancak, 2010 report'da Applicative da yoktu. Eğer extract ve pure açısından bind ve extend tanımlayabilirsiniz beri Ayrıca, otomatik olarak bir Extract örneği ve Applicative değerinde bir tip, hem Monad ve Comonad geçerli:

bindC :: Extract w => w a -> (a -> w b) -> w b 
bindC k f = f $ extract k 

extendM :: Applicative w => (w a -> b) -> w a -> w b 
extendM f k = pure $ f k  

* apply tanımlayabilmek extract açısından, class Extend w => Comonad w'un daha uygun olabileceğine dair bir işarettir, ancak 'un class (Applicative f, Bind f) => Monad f'a ve dolayısıyla ComonadComonad'a Comonad içine bölündüğü, bu yüzden daha fazla veya daha az saç saçıdır.

İlgili konular