ocaml - 在 OCaml 中管理动态依赖

标签 ocaml opam

想象一下 OCaml 中的一个库,它可能需要将其数据存储在某个地方。这个持久层可以用不同的库(sqlite、MySQL、PostgreSQL 等)来实现。并且根据存储的具体技术,它可能提供不同的特性和性能保证。

管理此类库的外部依赖项的可能方法有哪些?假设如果我使用 MySQL 进行开发,我不想在 sqlite 上引入编译时和运行时依赖性。

在 C++ 中,我可能会使用抽象接口(interface)并将具体逻辑放入有条件地包含在我的项目中的模块中(取决于配置开关)。我很好奇,怎么会有人在 OCaml 中处理相同的任务。

最佳答案

您可能会定义一个模块类型来抽象所有实现。例如

module type DB =
  sig
    type t
    type results

    val execute : t -> string -> results
    ...
  end

然后您将编写代码以将此模块类型的实现作为参数:

 module MyProg (D : DB) = struct
   let run db =
     let r = D.execute db "SELECT ..." in
     ...
 end

对于图书馆来说,这就是您所需要的。对于可执行程序,您需要一个单独的 main 函数来连接到一些实际的数据库,这可能是特定于 DB 的,但其余代码仅使用抽象的 DB

(当然,您会使用比这个基于字符串的 API 更好的 API。这只是一个简单的示例。)

关于ocaml - 在 OCaml 中管理动态依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25278412/

相关文章:

ocaml - 在匹配表达式中调用 2 个或多个函数

正则表达式字符间隔有异常

macos - 错误 : Version 1. 11 沙丘不受支持

unit-testing - 在 OCaml 中使用 OUnit 模块 - 未绑定(bind)模块 OUnit 错误

ocaml - camlzip : "This package relies on external (system) dependencies that may be missing."

list - Ocaml:使用 list.length

ocaml - OCaml 中的 Monadic 缓冲区

haskell - 是否有可能在 Haskell 98 中获得无限种类的错误?

ocaml命令行找不到 "topfind"

build - 在 OPAM 构建中检测目标架构