将多个OCaml签名归于模块

时间:2015-10-16 01:14:01

标签: module ocaml functor

组合签名的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

可能会有一种优雅的方式来获取签名的“联合”(但不是匿名联合),或者围绕具体的ORDEREDFIELD实现创建一个包装器模块碰巧分享一个类型t。我很好奇OCall的惯用方法是做我想要实现的目标。

1 个答案:

答案 0 :(得分:7)

使用includewith type t := t定义新的模块类型:

module type ORDERED_FILED = sig
  include ORDERED
  include FIELD with type t := t
end

如果没有with type t := t,则定义将被拒绝,因为ORDEREDFIELD都声明了相同名称的类型。 include FIELD with type t := t是"替代" t FIELD ORDERED.t ocamlc -i -c x.ml。{/ 1}

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 究竟是您想要的内容:

class LongMaxMin {
public static void main(String args[]) {

    long i = 0L;
    long result = 0L;

    for (; ; ) {
        result = i++;
        if (i<0) 
            break;
    }
    System.out.println("The biggest integer:" + result);
  }