组合签名的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。我很好奇OCall的惯用方法是做我想要实现的目标。
答案 0 :(得分:7)
使用include
和with type t := t
定义新的模块类型:
module type ORDERED_FILED = sig
include ORDERED
include FIELD with type t := t
end
如果没有with type t := t
,则定义将被拒绝,因为ORDERED
和FIELD
都声明了相同名称的类型。 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);
}