为什么Tuple没有Monad实例?

sem*_*lon 9 monads haskell tuples

我注意到的一件事是Tuple没有Monad实例.

然而,元组有一个Applicative实例:

instance Monoid a => Applicative ((,) a)
Run Code Online (Sandbox Code Playgroud)

这已经极大地限制了我们可以使Monad实例成为现实.

让我们看看我们为加入获得的类型签名:

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

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

join :: Monoid a => (a, (a, b)) -> (a, b)
Run Code Online (Sandbox Code Playgroud)

我们还可以看看Monad法则:

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)
Run Code Online (Sandbox Code Playgroud)

在这一点上,我们知道结合memptyx以任何一种方式导致x.我们唯一的类型信息x是它是一个Monoid.所以基本上只有两个实现是:

join (a, (b, x)) = (a <> b, x)
Run Code Online (Sandbox Code Playgroud)

和:

join (a, (b, x)) = (b <> a, x)
Run Code Online (Sandbox Code Playgroud)

而第二个是ap<*>不一样的.

所以现在我们知道唯一有效的Monad实例((,) a)是:

instance Monoid a => Monad ((,) a) where
    (a, c) >>= f = let (b, c') = f c in (a <> b, c')
Run Code Online (Sandbox Code Playgroud)

那么为什么目前不是这样呢?

sem*_*lon 2

好吧,这个问题的答案似乎是我只需要使用ghc-8.0.1,它确实给出了Tuple一个Monad实例。感谢@Michael 指出了这一点。