2016-07-16 49 views
6

Farkettiğim bir şey, Tuple'un Monad örneğinin olmamasıydı. Zaten son derece ağır biz Monad örneği olmak yapabilir ne kısıtlarTuple neden bir Monad örneğine sahip değil?

instance Monoid a => Applicative ((,) a) 

:

kayıt düzeni ancak bir Applicative örneği var.

instance Monoid a => Monad ((,) a) 

join :: Monad m => m (m a) -> m a 

join :: Monoid a => (a, (a, b)) -> (a, b) 

Biz de Monad yasalarına bakabilirsiniz:

katılmak için biz alacağı tipi imza inceleyelim

join $ f <$> pure x == f x 
join $ f <$> (mempty, x) == f x 
join (mempty, f x) == f x 
join (mempty, (a, b)) == (a, b) 

join $ pure <$> x = x 
join $ pure <$> (a, b) = (a, b) 
join (a, (mempty, b)) = (a, b) 

bildiğimiz bu noktada ki mempty ve x birleştirerek Her iki şekilde de x sonuçlanır. Ve x hakkında sahip olduğumuz tek tip bilgi, bir Monoid olmasıdır. Yani temelde sadece iki uygulaması şunlardır:

join (a, (b, x)) = (a <> b, x) 

ve:

join (a, (b, x)) = (b <> a, x) 

Ve bu markaların ap ve <*> değil aynı ikincisini.

Şimdi biz ((,) a) için geçerlidir Monad örneği olduğunu biliyoruz:

instance Monoid a => Monad ((,) a) where 
    (a, c) >>= f = let (b, c') = f c in (a <> b, c') 

Peki neden şu anda durum bu değil mi? Bu sorunun cevabı sadece Tuple bir Monad örneğini vermek işlevi gören ghc-8.0.1 kullanmak zorunda olduğu gibi

+6

'ghc-8.1' ile yeni olduğunu tahmin ediyorum - 'ghci' diyor ki örneği Monoid a => Monad ((,) a) - 'GHC.Base' 'tanımlı – Michael

+0

Vahşi bir tahmin: çünkü o' t Genel yeterli mi? 'Set' 'in bir tane bulunamamasının nedeni bu olabilir ... – ThreeFx

+1

'Set' hiçbir monad örneğine sahip değildir, çünkü monad yasalarını karşılayan hiçbir örnek mevcut olmayabilir. Önerilen örnek fo '((,) a)' yasayla uyuşmaktadır ve bence tek olası kanuna saygılı olan örnek, bu yüzden onu yaratmak mantıklı. – amalloy

cevap

1

Eh görünüyor. Bunu belirtmek için @Michael'a borç verin.

+1

'8.1' henüz yok; 8.0.1 anlamına geliyordu. Örnek [burada] bulunabilir (https://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Monad.html#control.i:ic:Monad:Monad:25). – crockeea

+0

@Eric ah ok, teşekkürler! – semicolon