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
'ghc-8.1' ile yeni olduğunu tahmin ediyorum - 'ghci' diyor ki örneği Monoid a => Monad ((,) a) - 'GHC.Base' 'tanımlı – Michael
Vahşi bir tahmin: çünkü o' t Genel yeterli mi? 'Set' 'in bir tane bulunamamasının nedeni bu olabilir ... – ThreeFx
'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