【问题标题】:Specify type of record field in OCaml在 OCaml 中指定记录字段的类型
【发布时间】:2015-01-23 21:13:43
【问题描述】:

我有这个代码

class person name_init =
  object
    val name = name_init
    method get_name = name
end;;

let p1 = new person "Steven" 
and p2 = new person "John" in
print_endline p1#get_name;
print_endline p2#get_name;;

它抱怨我的 person 对象中的 get_name 和 val name 是未绑定类型,我意识到这是准确的。在 OCaml 中如何指定 name_init(以及因此 name 和 get_name)是 string 类型?

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    为函数(包括构造函数)指定参数类型,如下所示:

    class person (name_init : string) =
    …
    

    如果您有多个参数,请将它们全部放在括号中。

    【讨论】:

    • 我记得之前尝试过,但是...使用大写-s 字符串。感谢您解决这个问题。
    【解决方案2】:

    OCaml 要求 class 表达式中的所有值都是具体的,或者绑定到类型参数。因此,当类型系统推断出表达式的类型是多态的时,您需要对其进行处理。你有两个选择:

    1. 约束表达式具有特定类型
    2. 约束表达式的类型等于类型参数。

    在第一种情况下,约束可以放在类表达式中的任何位置,因为该约束不允许多态表达式转义类表达式。举几个例子来说明这个想法:

    实例变量规范的约束:

    class person name_init =
      object
        val name : string = name_init
        method get_name = name
    end
    

    方法规范的约束:

    class person name_init =
      object
        val name = name_init
        method get_name : string = name
    end
    

    在你的例子中,我们还有两个地方可以放置约束,但我认为这个想法很清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2017-09-09
      • 1970-01-01
      相关资源
      最近更新 更多