指定OCaml中记录字段的类型

指定OCaml中记录字段的类型,ocaml,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是未

我有这个密码

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?

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

class person (name_init : string) =
…

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

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

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

    实例变量规范处的约束:

    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
    
    方法规范中的约束:

    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
    

    在您的示例中,我们还有两个地方可以设置约束,但我认为这一点相当清楚。

    我记得之前尝试过,但是。。。使用大写字母s字符串。谢谢你澄清这一点。