gpt4 book ai didi

interface - 在 OCaml 中使用仿函数作为接口(interface)

转载 作者:行者123 更新时间:2023-12-03 08:06:29 24 4
gpt4 key购买 nike

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

举个例子,假设我有一个这样的签名:

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

和两个不同的实现将是 Alg1Alg2 .这个 Algorithm模块应该代表各种实现的接口(interface),比如这两个。

现在我需要另一个组件,我们称之为 Executor这将是使用 Alg1 的模块或 Alg2通过他们的界面..

阅读仿函数似乎我应该需要一个接受 Algorithm 的仿函数并产生 ConcreteExecutor具有我需要的算法的具体实现。这样 Executor是一种对其组件进行参数化的模块。

我对吗?这是获得我需要的最佳方式吗?我想知道这样的想法,因为我来自 Java/C++ 背景,所以我习惯于使用接口(interface)和抽象类,我需要以正确的方式解决这个仿函数/模块抽象问题。

获得我想要的东西的正确语法是什么?

提前致谢

最佳答案

是的,听起来仿函数就是你想要的。事实上,你可以看看标准库是如何使用仿函数的,因为源代码是可用的。在我的机器上,它位于/usr/lib/ocaml/3.10.2/。例如,set.mli 包含以下内容:

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);;

因此,使用您的代码,Algorithm 替换 OrderedType,Alg1/Alg2 替换 String,Executor 替换 Make,ConcreteExecutor 是 Executor(Alg1/Alg2) 的结果。您还会注意到 string.mli/ml 没有提及 OrderedType。 String 是 OrderedType ,因为它具有类型 t 供函数 compare 使用。您无需明确表示 String 是 OrderedType。

关于interface - 在 OCaml 中使用仿函数作为接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3416224/

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