【问题标题】:OCaml explicit type signaturesOCaml 显式类型签名
【发布时间】:2011-05-14 22:26:03
【问题描述】:

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

val add : int -> int -> int ;;

给我一​​个错误。 (虽然我可以制作只提供签名的type 模块。)

  1. 在 OCaml 中不可能做到这一点,我是否正确?
  2. 如果是这样,为什么? OCaml 的类型系统似乎与 Haskell 没有太大的不同。

【问题讨论】:

    标签: syntax types ocaml type-inference


    【解决方案1】:

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

    let intEq (x : int) (y : int) : bool = ...
    

    或者可以将它们放在接口文件中,就像您所做的那样:

    val intEq : int -> int -> bool
    

    我相信后者是首选,因为它更清晰地将规范(类型)与实现(代码)分开。


    参考文献OCaml for Haskellers

    【讨论】:

    • 后一个选项不再是有效选项。至少 OCaml 4.04.0 不支持它。每个人都应该使用第一个选项。
    • 这完全不正确。 OCaml 4.04.0 及以上版本支持接口文件。 .mli 文件是声明模块接口的首选方式。
    【解决方案2】:

    一般来说,let-bind 具有约束类型的值的语法是:

    let val : constraint = e ...
    

    应用于函数,可以指定签名如下:

    let add : int -> int -> int = fun x y -> ...
    

    这类似于将模块约束到签名所需的语法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 2011-11-28
      相关资源
      最近更新 更多