【发布时间】:2012-09-20 15:14:52
【问题描述】:
class Monad m where
(>>=) :: forall a b. m a -> (a -> m b) -> m b
(>>) :: forall a b. m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
{-# INLINE (>>) #-}
m >> k = m >>= \_ -> k -- <-- !! right here !!
fail s = error s
您可以看到>> 有一个默认实现。我的问题是,它被认为是好的还是坏的做法,为什么要在类型类中包含一个函数/组合器 in,而不是在类型类之外单独提供它?
也就是说,为什么不呢:
class Monad m where
(>>=) :: forall a b. m a -> (a -> m b) -> m b
return :: a -> m a
fail :: String -> m a
fail s = error s
还有其他地方:
(>>) :: forall a b. m a -> m b -> m b
{-# INLINE (>>) #-}
m >> k = m >>= \_ -> k
【问题讨论】: