title: What is the relationship between Applicative, Foldable and Traversable?
body: <p>I'm trying to understand what exactly is needed from the <code>Applicative</code> interface in order to perform any <code>traverse</code>. I'm stuck as they are not used in the default implementation as if the constraint was to strict. Is Haskell's type system too weak to describe the actual requirements?</p>
  
  <pre><code>-- | Map each element of a structure to an action, evaluate these actions
  -- from left to right, and collect the results. For a version that ignores
  -- the results see 'Data.Foldable.traverse_'.
  traverse :: Applicative f =&gt; (a -&gt; f b) -&gt; t a -&gt; f (t b)
  traverse f = sequenceA . fmap f
  
  -- | Evaluate each action in the structure from left to right, and
  -- and collect the results. For a version that ignores the results
  -- see 'Data.Foldable.sequenceA_'.
  sequenceA :: Applicative f =&gt; t (f a) -&gt; f (t a)
  sequenceA = traverse id
  </code></pre>
  
  <p>A possibly related side question, why is <code>sequenceA_</code> defined in <code>Foldable</code>?</p>