/**
* traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
*
* Map each element of a structure to an action, evaluate these actions from left to right, and collect the results
*
* @param callable $transformation (a -> f b)
* @param Traversable $t t a
*
* @return Applicative f (t b)
*/
function traverse(callable $transformation, Traversable $t = null)
{
return call_user_func_array(curryN(2, function (callable $transformation, Traversable $t) {
return $t->traverse($transformation);
}), func_get_args());
}