I know `trait Foo[T]` means `T` is a parametrized type.
But some times I can see `trait Foo[T1,T2]`, or `trait Foo[T1,T2,R]`, I cannot find anywhere describe the meaning of multiple types inside a type bracket, could you please point me the usages in this case? From what I speculate, Foo[T1,T2] just means, it defined two type parameters, it doesn't have to be take a `T1` and return a `T2`.

When I read [playframework](https://github.com/playframework/Play20/wiki/ScalaBodyParsers) documentation today, I again found myself confused about this question. In the documentation, it says:

> 
> A BodyParser[A] is basically an Iteratee[Array[Byte],A], meaning that
>  it receives chunks of bytes (as long as the web browser uploads some
>  data) and computes a value of type A as result.
> 
> 
> 

This explanation sounds like, the second the type parameter inside a type bracket is a return type. 

I also remember that `trait Function2 [-T1, -T2, +R] extends AnyRef` means a function that takes a `T1` and `T2`, return a `R`.

Why do they put the return type in the bracket? Does it mean all the last parameter in a bracket is a return type? Or they just happened defined a new type R for the return type?