【问题标题】:Standard ML: Naming datatypes of function arguments possible?标准 ML:可以命名函数参数的数据类型吗?
【发布时间】:2011-09-06 00:51:57
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: sml standards ml


    【解决方案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) 这样的东西,请使用 varvar: string 进行显式类型注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2017-02-08
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      相关资源
      最近更新 更多