在类型类定义中添加附加函数/组合器的优缺点是什么?

Mat*_*ick 13 haskell typeclass

看看Monad来源:

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是一个更简单的例子.

  • @CAMcCann我会说在类中包含更多_methods_的缺点是它可能减少可能的实现数量; 例如`Monoid`是一个很好的类型类,但是`Semigroup`也是如此.(当然,这不适用于_combinators_ - 仅适用于概念上与任何其他方法不同的方法.) (2认同)