Стандарт ML: возможно ли присвоение имен типам аргументов функций? - PullRequest
1 голос
/ 01 июня 2011

Я новичок в ML, и у меня есть функция, которая получает специальный предопределенный тип данных и может ссылаться на весь его тип данных аргумента, а не на его компоненты.

Вот глупый пример:

datatype frame = Frame of string list * string list 

(* Type: fn : string * frame -> frame *)
val lookup_variable_value_in_frame = 
  fn (string(var), Frame(variables, values)) =>     
    ... 
    Frame(variables, values) 
    ... ;

1) Я хочу вернуть данный кадр.Должен ли я построить еще один Frame?

2) Я хочу передать данный кадр другой функции, я должен снова предоставить новый Frame(variables, values)?

Я хотел бы написать что-то вродеэто:

val lookup_variable_value_in_frame = 
     fn (string(var), frame : Frame(variables, values)) =>  ... 

тогда я смогу использовать раму или ее компоненты.

Спасибо.

1 Ответ

2 голосов
/ 01 июня 2011

Ваш тип данных уже имеет имя, frame.Вам не нужно создавать еще один frame для возврата или передачи другой функции.Первый вариант использует явную аннотацию типов:

(* Type: fn : string * frame -> frame *)
val lookup_variable_value_in_frame = 
  fn (var: string, f: frame) =>     
    ... 
    f 
    ... ;

Этот параметр не распространен, его следует использовать только тогда, когда вам нужны типы менее универсальные, чем они выводятся с помощью средства проверки типов.Другой вариант - использование ключевого слова as для создания другой привязки к значению:

val lookup_variable_value_in_frame = 
     fn (var, f as Frame(variables, values)) =>  
         ...(* using f, variables or values here *)

Обратите внимание, что в SML нет такой вещи, как string(var), либо используйте var или var: string для явногоТип аннотации.

...