gpt4 book ai didi

module - 将多个 OCaml 签名归因于一个模块

转载 作者:行者123 更新时间:2023-12-04 23:18:46 24 4
gpt4 key购买 nike

Ocaml 组合签名

假设我有两个签名,Ordered 和 Field

module type ORDERED = sig 
type t
type comparison = LT | EQ | GT
val cmp : t -> t -> comparison
end

module type FIELD = sig
type t
val (+) : t -> t -> t
val ( * ) : t -> t -> t
val inv : t -> t
val neg : t -> t
val zero : t
val one : t
end

我想制作一个需要两个 Ordered Fields 的仿函数并产生另一个 Ordered Field (假设操作是按组件应用的,我们使用字典顺序进行比较)。我将如何指定“输入模块”同时满足两个签名?

这是我想做的一些稻草人语法:
module NaivePair = functor (Left : ORDERED & FIELD) (Right : ORDERED & FIELD) ->
struct
type t = Left.t * Right.t
(* definitions *)
end

可能有一种优雅的方式来获取签名的“联合”(但不是匿名联合),或者在具体 ORDERED 周围创建一个包装器模块和 FIELD恰好共享一个类型 t 的实现。我很好奇 OCaml 惯用的方式来做我想要实现的目标是什么。

最佳答案

使用 include 定义新的模块类型和 with type t := t :

module type ORDERED_FIELD = sig
include ORDERED
include FIELD with type t := t
end
没有 with type t := t ,定义被拒绝,因为 ORDEREDFIELD声明同名的类型。 include FIELD with type t := t是“替代” tFIELD通过 ORDERED.t . ocamlc -i -c x.ml看看 ORDERED_FIELD正是你想要的:
$ ocamlc -i -c x.ml
...
...
module type ORDERED_FILED =
sig
type t
type comparison = LT | EQ | GT
val cmp : t -> t -> comparison
val ( + ) : t -> t -> t
val ( * ) : t -> t -> t
val inv : t -> t
val neg : t -> t
val zero : t
val one : t
end

关于module - 将多个 OCaml 签名归因于一个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33161002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com