Re:.NET NanoFramework
by sesm on Saturday January 16, 2021 @07:33AM
(#25801836)
Does this imply that generics in Ocaml/Haskell are not real?
[ Parent
| on HN ]
My understanding is it doesn't matter in Haskell since it lacks reflection, they are real because you can't reflect and see they have been type erased at runtime.
In C# and Java reflection is used extensively and the generics still exist in C# when reflecting they are gone in Java.
Re:.NET NanoFramework
by sideeffffect on Saturday January 16, 2021 @07:55AM
(#25801909)
"Generics" in Haskell are real, but they're not what is in the .NET lingo called reified. Just like Java does not monomorphise.
On the other hand, C#, F# or Rust monomorphise (have reified generics).
Re:.NET NanoFramework
by DaiPlusPlus on Saturday January 16, 2021 @01:12PM
(#25804036)
Are “monomorphism” and “reification” interchangeable terms though? Considering how .NET now has covariant/contravariant generics I wonder if it could be described as having “polymorphic” generics as opposed to monomorphic generics - (unrelated to OOP polymorphism, ofc).
Re:.NET NanoFramework
by sideeffffect on Saturday January 16, 2021 @01:49PM
(#25804346)
AFAIUI _monomorphisation_ and reification are interchangable.
That means, that if I have a polymorphic (generic) class `MyClassA<T>`, the compiler (regardless if it is JIT in the runtime as in C#, or AOT as in Rust) monomorphises (reifies) `MyClassA` for each instantiation of `T`. So `MyClassA<MyClassB>` and `MyClassA<MyClassC>` are distinct classes.
For this reason, co-/contra-variance in C# works only for interfaces. Type parameters in classes are invariant. `MyClassA<MyClassB>` and `MyClassA<MyClassC>` are distinct classes, neither sub-/super-class of the other, even if `MyClassB` were a subclass of `MyClassC`.