gpt4 book ai didi

haskell - 为什么 Tuple 没有 Monad 实例?

转载 作者:行者123 更新时间:2023-12-02 06:40:29 26 4
gpt4 key购买 nike

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

元组确实有一个 Applicative实例:

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

这已经极大地限制了我们可以制作 Monad 的内容例如。

让我们看看我们将获得的连接类型签名:

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

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

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

我们还可以看看 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)

此时我们知道组合 memptyx无论哪种方式都会导致 x 。我们拥有的唯一类型信息是 x是它是 Monoid 。所以基本上仅有的两个实现是:

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

和:

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

其中第二个是 ap<*>不一样。

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

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

那么为什么目前情况并非如此?

最佳答案

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

关于haskell - 为什么 Tuple 没有 Monad 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38415374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com