Стандартный ML: возможно ли присвоение имен типам данных аргументов функции?

Я новичок в 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)) =>  ... 

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

Спасибо.


person Itay    schedule 01.06.2011    source источник


Ответы (1)


У вашего типа данных уже есть имя 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 для явной аннотации типа.

person pad    schedule 01.06.2011