Parametric Polymorphism
It’s been some time but we’ve finally ticked off another goal on the roadmap. The basics of parametric polymorphism work. You can define a type, such as List(a), note that a syntax sugar for list cells and lists does not exist yet:
type List(a) = Nil | Cons ( head : a, tail : List(a) )
Here a is a type variable. It can be substituted for any concrete type.
Write a polymorphic function:
func list_length(l : List(a)) -> Int { match (l) { Nil -> { return 0 } Cons(_, rest) -> { return 1 + list_length(rest) } } }
And call it with a list of numbers, or strings, or any concrete type.
List1 = Cons(1, Cons(2, Cons(3, Cons(4, Nil)))) print!(int_to_string(list_length(List1)) ++ "\n") List2 = Cons("A", Cons("B", Cons("C", Nil))) print!(int_to_string(list_length(List2)) ++ "\n")
There are some rough edges to clean up, for example the compiler doesn’t check whether the correct number of types or variables are listed when referring to a type (such as writing List when one should write List(a)). And polymorphism will become much more useful once Plasma supports other features such as higher order values/calls (next major goal) and interfaces.