source for Monadを見る: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
あなたは>>
は、デフォルトの実装を持っていることがわかります。私の質問は、それが良いか悪い練習と考えられているのですか?また、なぜ関数型/結合子を型クラスの外に別に提供するのではなく、型クラスをに含めるのですか?
:
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
versa.'それは*あなたも*短所をリストでした(!と
Monad
Functor
のサブクラスを作る)型クラスにすべての4つの演算子を置くためにあなたを奨励し、join
の面で>>=
のデフォルトの定義を与え、副? –@TikhonJelvis:正直言って、そこにはどのような客観的な欠点があるのかは分かりません。間違いなくクラスの性質を難読化し、GHCが内部で使用するクラス辞書を膨らませるかもしれませんが、明白で明らかな欠点がある場合、私はそれらを認識しません。 –
それは私が思ったものです。しかし、私が知る限り、これらのデフォルトの実装はかなり頻繁に使用されているので、興味があります。 –