Mat*_*ick 13 haskell typeclass
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
Run Code Online (Sandbox Code Playgroud)
您可以看到它>>
具有默认实现.我的问题是,在类型类中包含一个函数/组合子,而不是在类型类之外单独提供它,它被认为是好的还是坏的实践,为什么?
那就是为什么不:
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
Run Code Online (Sandbox Code Playgroud)
和其他地方:
(>>) :: forall a b. m a -> m b -> m b
{-# INLINE (>>) #-}
m >> k = m >>= \_ -> k
Run Code Online (Sandbox Code Playgroud)
C. *_*ann 13
据我所知,包含"额外"功能有两个主要原因:
效率:有时存在低效的通用实现,并且类的作者期望特定于实例的实现明显更好.在这种情况下,在类中包含具有默认实现的函数意味着实例可以根据需要使用优化版本,但不是必需的.有关这方面的有趣示例,请查看Foldable
.这也是如此Monad
.
实现的选择:通常可以使用几个类函数的子集; 包括所有潜在的函数并使用默认实现相互意味着实例可以选择一些函数来实现并自动获取其余的函数.这也适用于Foldable
,但是Eq
是一个更简单的例子.