Недавно я заметил, что перед именем функции в объявлении функции допускается переменная типа. Но я не вижу, как он используется. Вот несколько примеров:Перечислить переменную перед именем функции и ограничениями в области видимости
Poly/ML 5.5.2 Release
> fun 'a print a = PolyML.print (a);
val print = fn: 'a -> 'a
> print "foo";
?
val it = "foo": string
> pint string "foo";
Error-Value or constructor (string) has not been declared
Found near print string "foo"
Static Errors
> string print "foo";
Error-Value or constructor (string) has not been declared
Found near string print "foo"
Static Errors
> val f : string -> string = print;
val f = fn: string -> string
> f "foo";
?
val it = "foo": string
Поэтому у меня есть несколько вопросов, основанных на этом. Во-первых, что является хорошим примером использования для переменной типа перед именем функции (в отличие от более распространенной переменной типа в аргументе или сигнатуре типа возврата). Кроме того, есть ли способ, чтобы указать, что я хочу, чтобы специализироваться на типе, как, как я могу с типом ?:
> type 'a t = 'a list;
eqtype 'a t
> type f = string t;
type f = string t
Я объявляю специализацию, создав новую переменную val f
, с явной сигнатуры типа , но я не думаю, что это одно и то же. Например, исходя из приведенного выше примера типа, я ожидал, что смогу это сделать:
> val s = string print;
Error-Value or constructor (string) has not been declared Found near string print
Static Errors
Но это не удается.
И, наконец, почему переменная типа спрятала тип аргумента внутри функции? Я только предполагаю, что это происходит вообще, потому что функция PolyML.print печатает знак вопроса (указав, что он не знает тип), а не фактическое значение. Даже когда я объявлял новую функцию f
, которая явно ограничивала тип, она все еще не знала тип передаваемых переменных. (Хотя я уверен, что эта конкретная часть не имеет ничего общего с исходной переменной типа функции, а скорее переменной типа (неявный) по аргументу a
.)