Hello
It would be very useful to have higher kinded types in Kotlin.
I have the following interfaces:
interface A<T> {}
interface B<T> : A<T> {}
In this example A<T> and B<T> are first order types (*).
But A and B are “higher” types (* → *) in that they need a parameter T to make a “normal”
fist order type.
Support for higher order types would be useful in the following situation.
I want to have a function, that maps an A<T> to A<T> and B<T> to B<T>:
fun <X: A,T> f(x: X<T>): X<T>
This is currently not possible within the Kotlin type system.
Type arguments are not allowed for type parameters
A workaround would be to encode the output type in the Interface:
interface A<X: A<X,T>,T> {}
interface B<T> : A<B<T>,T> {}
interface C<T> : A<C<T>,T> {}
fun <X: A<X,T>,T> f(x: X): X
But this is overly complicated and it does not allow me to write functions for
interfaces that I import from libraries that I don’t control.