English 中文(简体)
Polymorphic function as return value and value restriction in SML
原标题:
  • 时间:2010-01-27 21:17:20
  •  标签:
  • sml
  • smlnj

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

最佳回答

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:

  1. Call ref [] and get back a list of type forall a . a list ref
  2. Insert a string.
  3. 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.

问题回答

暂无回答




相关问题
Standard ml function in datatype problem

I have to create a function about peano numbers defined as the following datatype: datatype a peano = P of ( a -> a) * a -> a val zero = P(fn (f, x) => x) The function that I have to ...

convert string to list in Standard ML [duplicate]

Possible Duplicate: Open file in ML(SMLNJ) I have a string value which has value like this: "[(1,2,3),(2,3),(6,8)]" -> string but I want to have these values in int type like this: [(1,2,3),...

Open file in ML(SMLNJ)

I need to read file in ML (SLMNJ) and save it in some structures. I need to read some data that points to graph declaration: [( 1 , 2 , 13 ),( 2 , 3 , 3 ),( 2 , 4 , 8 ),( 2 , 5 , 4 ),( 3 , 1 , 5 ),( ...

Line Comments in Standard ML

I m learning ML, with the SML/NJ dialect. What I m trying to figure out is if there is a line comment operator. I found the block comment operator, (* ... *), but I really miss line comments. ...

How to fix the SML/NJ interactive system to use Arrow Keys

I m having some trouble using SML/NJ interactive system, namely, that when I try to use my arrow keys (either left or right to make a correction in the expression I ve typed, up to repeat the last ...

What causes this Standard-ML type error?

I was trying to make a tail-recursive version of this very simple SML function: fun suffixes [] = [[]] | suffixes (x::xs) = (x::xs) :: suffixes xs; During the course of this, I was using type ...

热门标签