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)
在这一点上,我们知道结合mempty和x以任何一种方式导致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)
那么为什么目前不是这样呢?
| 归档时间: |
|
| 查看次数: |
1431 次 |
| 最近记录: |