Foldable
はFunctor
がApplicative
とMonad
のスーパークラスであるのと同様にTraversable
のスーパークラスです。Foldableに加えてTraversableが持つ「別個の方法」は何でしょうか?
Monoid m => (,) m
モナドを用い
foldMap
foldLiftT :: (Traversable t, Monoid m) => (a -> m) -> t a -> m
foldLiftT f = fst . traverse (f >>> \x -> (x,x))
-- or: . sequenceA . fmap (f >>> \x -> (x, x))
ようにエミュレートすることができ
liftM :: Monad m => (a->b) -> m a -> m b
liftM f q = return . f =<< q
としてfmap
を実現することができるMonad
の場合と同様に
。したがって、スーパークラスとメソッドの組み合わせは、どちらの場合も一定の冗長性を持ちます。モナドの場合
、
class (Functor m) => Monad m where
return :: a -> m a
join :: m (m a) -> m a
が、少なくともそれは圏論で使われているものです(私は応用的/ monoidalをスキップします)型クラスの「より良い」の定義が可能と主張することができます。この定義では、Functor
スーパークラスを使用せずに、はではありません。liftM
であるため、この冗長性はありません。
Traversable
クラスでも同様の変換が可能ですか?
明確にする:私が後だが再定義され、のはそれを呼びましょう、
class (Functor t, Foldable t) => Traversable t where
skim :: ???
、そのような私たちは、実際のTraverse
メソッドを作ることができることを、トップレベルの機能
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
ですが、はありません。は一般的に
instance (Traversable t) => Foldable t where
foldMap = ... skim ...
data T
instance Traversable T where
skim = ...
私はにはが必要なので、私は尋ねません。 Foldable
とTraversable
の違いをよく理解するための概念的な質問です。ここでも多くのようなMonad
Functor
対:(あなたは通常、まさにこの組み合わせfmap
とjoin
の必要があるため)>>=
がはるかに便利日常のHaskellプログラミングのjoin
よりもある一方で、後者はそれが単純なモナドが何であるかを把握することができます。
Foldable
別の方法は「トラバース」です。 'Foldable'という言葉で実装することはできません。 –
もちろん、そうではありませんが、 'Foldable'を' traverse'の形で実装することができます。 – leftaroundabout
...これは、 'Foldable'が' Traversable'のスーパークラスである理由です。スーパークラスは、サブクラスに関して実装可能である必要があります。 –