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
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
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 Comonad
Comonad
'a Comonad
içine bölündüğü, bu yüzden daha fazla veya daha az saç saçıdır.
'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
bir cevap gibi geliyor! – nicolas
@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