Scala is definitely one of the better functional languages for Java.  (It's OO implementation is not that great, however.)<p>I am left with a few questsions:<p>Monoid was used as an example, but does Scala's type system support instances like:<p><pre><code>   instance (Monoid a, Monoid b) =&#62; Monoid (a,b) where
      mempty = (mempty, mempty)
      ...
</code></pre>
In this case, a mempty tuple is created by creating a mempty "a" and then a mempty "b".  If you think about it, this is obvious, but the question is whether Scala's type system knows what "a" and "b" are at the right time, so it can delegate to the right "other" mempty.<p>(I ask, because I wrote a Haskell-style data structure module for Perl, but it is missing Monoid for this reason.  We would know the types <i>after</i> mempty ran, but we can't run it without knowing the types.  If only you could fold time back on itself...)<p>Also, they use the word "forAll" to describe type signatures; are higher-rank types allowable?