在OCaml中指定记录字段的类型

时间:2015-01-23 04:13:40

标签: ocaml

我有这段代码

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_init(以及name和get_name)在OCaml中的字符串类型是什么?

2 个答案:

答案 0 :(得分:1)

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

class person (name_init : string) =
…

如果您有多个参数,请将它们全部放入parens。

答案 1 :(得分:0)

OCaml要求class表达式中的所有值都是具体的,或绑定到类型参数。因此,当类型系统推断出表达式的类型是多态的时,你需要对它做一些事情。你有两个选择:

  1. 约束表达式具有特定类型
  2. 约束表达式使类型等于类型参数。
  3. 在第一种情况下,约束可以放在类表达式中的任何位置,因为此约束不允许多态表达式转义类表达式。举几个例子,来证明这个想法:

    约束实例变量规范:

    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
    

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