Polymorphic function as return value and value restriction in SML
sml, smlnj
Solution
For technical reasons, you are not allowed to generalize (i.e., make polymorphic) the results of a function call. The result of a call must have a monomorphic type. If this weren't the case, you could subvert the type system by the following dirty trick:
- Call `ref []` and get back a list of type `forall 'a . 'a list ref`
- Insert a string.
- Remove a function
and there you are: you are now executing the contents of an arbitrary string as code. Not Good.
By insisting that the value returned by `ref []` be monomorphic, you ensure that it can be used as a list of strings or a list of functions but not both. So this is part of the price we pay for type safety.
Problem
Basically, I want to have a function to return a polymorphic function, some thing like this: fun foo () = fn x => x So the foo function takes in a value of type unit and returns a polymorphic identity function and the compiler is happy with that, it gives me: val foo = fn : unit -> 'a -> 'a but once I actually call the foo function, the return value is not what I expected val it = fn : ?.X1 -> ?.X2 Can't generalize because of value restriction it says, any help? thanks in advance