Syntax OCaml显式类型签名

Syntax OCaml显式类型签名,syntax,types,ocaml,type-inference,Syntax,Types,Ocaml,Type Inference,在Haskell中,显式声明函数的类型签名被认为是一种良好的做法,即使它(通常)是可以推断的。这在OCaml中似乎是不可能的,例如 val add : int -> int -> int ;; 给我一个错误。(尽管我可以制作只提供签名的类型模块。) 这在OCaml中是不可能的,我说的对吗 若然,原因为何?OCaml的类型系统似乎与Haskell没有太大的不同 OCaml有两种指定类型的方法,它们可以内联完成: let intEq (x : int) (y : int) : bool

在Haskell中,显式声明函数的类型签名被认为是一种良好的做法,即使它(通常)是可以推断的。这在OCaml中似乎是不可能的,例如

val add : int -> int -> int ;;
给我一个错误。(尽管我可以制作只提供签名的
类型
模块。)

  • 这在OCaml中是不可能的,我说的对吗
  • 若然,原因为何?OCaml的类型系统似乎与Haskell没有太大的不同

  • OCaml有两种指定类型的方法,它们可以内联完成:

    let intEq (x : int) (y : int) : bool = ...
    
    也可以将它们放置在接口文件中,如您所做:

    val intEq : int -> int -> bool
    
    我认为后者是首选,因为它更清晰地将规范(类型)与实现(代码)分开



    参考资料:

    Im常规,让-用约束类型绑定值的语法为:

    let val : constraint = e ...
    
    应用于函数时,可以按如下方式指定签名:

    let add : int -> int -> int = fun x y -> ...
    
    这类似于将模块约束到签名所需的语法:

    module Mod
      : sig    ... end
      = struct ... end
    

    后一个选项不再是有效选项。至少OCAML4.04.0不支持它。每个人都应该使用第一个选项,这根本不正确。OCaml 4.04.0及以上版本支持接口文件
    .mli
    文件是向模块声明接口的首选方式。