module Traversable where

open import Prelude
open import Algebra
open import Applicative

private variable F G : Type a  Type b

module _ where
  open Algebra.Applicative  ... 

  record Traversable (T : Type a  Type a) : Type (ℓsuc a) where
    field
      traverse : {F : Type a  Type a}  applicative : Applicative F   (A  F B)  T A  F (T B)
      identity : (xs : T A)  traverse  applicative = idApplicative  id xs  xs
      compose : {F G : Type a  Type a}  _ : Applicative F   _ : Applicative G  
                (f : B  F C) (g : A  G B) 
                (xs : T A) 
                map (traverse f) (traverse g xs)  traverse  applicative = composeApplicative it it  (map f  g) xs