代码之家  ›  专栏  ›  技术社区  ›  Jack

在OCaml中使用函子作为接口

  •  8
  • Jack  · 技术社区  · 15 年前

    我正在OCaml中开发一些算法,这些算法需要一些部分是“可插入的”,以便将部分计算留给特定的计算机。

    module type Algorithm = sig
        val feed : float -> unit
        val nth : int -> (float -> float)
    end
    

    两种不同的实现 Alg1 Alg2 . 这个 Algorithm

    现在我需要另一个组件,我们称之为 Executor 这将是使用 通过他们的界面。。

    在阅读有关函子的文章时,我似乎需要一个具有 算法 ConcreteExecutor 具体实现了我所需要的算法。以便 遗嘱执行人

    我说得对吗?这是获得我所需要的东西的最好方法吗?我想知道TykKGS,因为我来自java/C++背景,所以我习惯使用接口和抽象类,我需要正确地进入这个函数/模块抽象问题。

    哪一个是正确的语法来获得我想要的?

    提前谢谢

    1 回复  |  直到 15 年前
        1
  •  4
  •   Niki Yoshiuchi    15 年前

    module type OrderedType =
      sig
        type t
        val compare : t -> t -> int
      end
    
    module type S
      sig
        ...
      end
    
    module Make (Ord : OrderedType) : S with type elt = Ord.t
    

    如果要在OCaml中使用集合,请执行以下操作:

    module SSet = Set.Make(String);;
    

    所以在代码中,算法替换OrderedType,Alg1/Alg2替换String,Executor替换Make,ConcreteExecutor是Executor(Alg1/Alg2)的结果。您还将注意到string.mli/ml没有提到OrderedType。String是OrderedType,因为它有一个由compare函数使用的类型t。您不需要显式地说String是OrderedType。

    推荐文章