Type Constructors in Java and Scala
In "Functional Programming in Scala", I came across this code:
trait Foldable[F[_]] { ...
This is an example of something common in Java and Scala: type constructors.
"We write it as F[_], where the underscore indicates that F is not a type but a type constructor that takes one type argument. Just like functions that take other functions as arguments are called higher-order functions, something like Foldable is a higher-order type constructor or a higher-kinded type.
"Just like values and functions have types, types and type constructors have kinds. Scala uses kinds to track how many type arguments a type constructor takes, whether it’s co- or contravariant in those arguments, and what the kinds of those arguments are." [1]
However, each language differs in their use of type constructors.
"[I]n Scala it is not valid to say something is of type List, unlike in Java where javac would put the List<Object> for you. Scala is more strict here, and won’t allow us to use just a List in the place of a type, as it’s expecting a real type - not a type constructor." [2]
Java doesn't allow you to write something so abstract as the Foldable trait above. For instance, this won't compile:
public class Foldable<U<T>> { ...
[1] Functional Programming in Scala
No comments:
Post a Comment