1

我是 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)) =>  ... 

然后我就可以使用框架或其组件了。

谢谢你。

4

1 回答 1

2

您的数据类型已经有一个名称,即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用于显式类型注释。

于 2011-06-01T07:30:48.953 回答