Somut örnek monadlar kompozisyon altında kapalı olmadığımızı göstermek (kanıtı)?
Uygulamalı funktorlar kompozisyon altında kapalı olan tanınmış ama monadlar değildir. Ancak, sorun somut bir counterexample monadlar her zaman yazmak etmeyin gösteren bulmakta güçlük olmuştur.
This answer non-monad bir örnek olarak [String -> a]
verir. Bir bit için uğraşırken, sezgisel olarak inanıyorum, ama bu cevabı sadece "olamaz" gerçekten herhangi bir gerekçe vermeden. uygulanmaya katıl diyor sonra Daha resmi bir şey istiyorum. Dersin Türü [String -> [String -> a]] -> [String -> a]
; böyle bir işlevi mutlaka monad yasaları tatmin etmediğini göstermek gerekir işlevleri vardır.
Herhangi bir örnek (eşlik eden kanıt) yapacak; mutlaka özellikle yukarıdaki örneğin bir kanıt arıyorum.
CEVAP
Küçük beton bir counterexample için, terminal monad düşünün.
data Thud x = Thud
return
>>=
Thud
ve kanunları basit tutun.
Şimdi de Bool (diyelim, xor-monoid yapısı ile) yazar monad.
data Flip x = Flip Bool x
instance Monad Flip where
return x = Flip False x
Flip False x >>= f = f x
Flip True x >>= f = Flip (not b) y where Flip b y = f x
Er, um, kompozisyon ihtiyacımız var
newtype (:.:) f g x = C (f (g x))
Şimdi tanımlamak için uğraşıyor
instance Monad (Flip :.: Thud) where -- that's effectively the constant `Bool` functor
return x = C (Flip ??? Thud)
...
Parametricity ???
sabit olmalı x
, herhangi yararlı bir şekilde bağlı olamayacağını söyler. Sonuç olarak, join . return
mutlaka sabit bir işlevi de, yasa dolayısıyla
join . return = id
biz her ne sebeble olursa olsun başarısız gerekir.
TDD göstermek için iyi bir örnek sınıf...
Gıt birleştirme SVN daha kolay gerçekt...
Olmayan bir programcı için programlama...
Kategori, Monoid ve Monad göstermek iç...
Örnek değişken: bireysel vs @...