Můžeš prosím rozvést, proč tak zdůrazňuješ tuto skutečnost?
Jeden z rozdílů je v automatické generalizaci. Například tohle funguje
let id = (x) => x; let x = Some(id);
a x
má očekávaný typ option(('a) => 'a)
. Zatímco tohle nefunguje
let some(x) = Some(x); let x' = some(id);
x'
dostane typ option(('_a) => '_a)
a kompilátor vypisuje chybu This expression's type contains type variables that can't be generalized. Rozdíl je jen v tom, že jednou používáme konstruktor Some
a podruhé funkci some
. Je to důsledkem relaxed value restriction, což je omezení, které dovoluje generalizovat pouze typy hodnot (a mezi hodnoty spadají konstruktory a nespadají tam volání funkcí).