ocaml - 我可以仅为某些仿函数参数定义 OCaml 函数吗?

标签 ocaml

我想做这样的事情:

module Make (M: MInt) (N: MInt) : T = struct
    (* always defined *)
    let foo = 42

    (* only defined when M == N or M.x == N.x, something like that *)
    let bar a b = a * b
end

这可能吗?

显然我可以在运行时检查,但我很好奇如何在编译时进行检查。谢谢!

最佳答案

要对此类事物进行编码,需要一种具有 dependent typing 的语言。依赖类型是类型系统的一个强大功能,但不幸的是它使语言变得复杂并使类型推断变得不可判定。通常,这比普通程序员愿意支付的费用要高得多。如果您确实想要一种允许您编写此类规范的语言,那么您需要尝试 Coq

OCaml 仍然通过 Generalized Algebraic Data types 对某种程度受限的依赖类型提供支持。 。因此,理论上,在 OCaml 中,您可以编码一个函数,该类型确保两个参数是相等的整数。为此,您需要使用皮亚诺数字而不是内置整数,或者用幻像类型注释内置整数,描述其大小。但这一切都是相当不切实际的。在 Coq 中编写此代码,然后将定义提取为 OCaml 程序要容易得多。

总而言之,在仿函数级别上做你想做的事情是不可能的。使用 OCaml 类型系统来表达这样的事情是可能的。但最好使用 Coq 来实现这一点,并在 OCaml 中让事情变得简单。

关于ocaml - 我可以仅为某些仿函数参数定义 OCaml 函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31902512/

相关文章:

ocaml - 访问 OCaml 记录

python - OCaml 中最简单的 Python 枚举函数模拟是什么?

if-statement - 简单 if-then-else 中的 Ocaml 语法错误

types - ocaml %identity 函数

class - 如何使用 OCaml 中的类类型强制类中的 val 在类中不可变

pattern-matching - 在OCaml中什么时候需要驳回案件?

prolog - SICStus Prolog 垃圾收集跟踪消息

exception - 不能仅在 mli 文件中定义异常

functional-programming - 函数式编程(OCaml)中的签名/类型

ocaml - 为什么这个 OCaml 代码收到 "Unexpected token"?