首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用模块的构造函数

如何调用模块的构造函数
EN

Stack Overflow用户
提问于 2022-10-30 10:26:42
回答 2查看 46关注 0票数 0

假设我在名为implementation的文件中有以下模块签名monoids.ml

代码语言:javascript
复制
module type MonoidADT = sig
  type 'a monoid
  (* . . . *)
end

module Monoid : MonoidADT = struct
  type 'a monoid = Monoid of ('a list) * ('a -> 'a -> 'a) * ('a)
  (* . . . *)
end

如何在其他文件(模块)中使用在实现中定义的类型的构造函数?它是可直接访问的,还是应该创建类似于以'a monoid作为返回类型的工厂函数?

我试图做的只是打开模块并像在模块中那样调用它的构造函数,但是它当然不能工作,并给出了Unbound constructor Monoid错误:

代码语言:javascript
复制
open Monoids.Monoid;;

let boolean_monoid = Monoid ([true; false], ( || ), false);;
EN

回答 2

Stack Overflow用户

发布于 2022-10-30 10:56:52

签名约束删除信息。此外,如果您删除太多的信息,您可以完美地结束与不可用的模块。

通常,当你写

代码语言:javascript
复制
module Monoid : MonoidADT = struct
  ...
end

你要求编译器将你的单子限制在每个单子共享的签名上。如果您的单类模块类型是标准模块类型:

代码语言:javascript
复制
module type MonoidADT = sig
  type t
  val e: t
  val ( * ): t -> t -> t
end

这意味着您将限制自己编写与一个元素monoid兼容的代码:

代码语言:javascript
复制
module One = struct
  type t = unit
  let e = ()
  let ( * ) () () = ()
end

这不太可能是你想要的。

如果您只希望检查您的模块是否是某些模块类型的子类型,则可以编写:

代码语言:javascript
复制
module _ : MonoidADT = Monoid
票数 1
EN

Stack Overflow用户

发布于 2022-10-30 11:18:52

显然,在签名和实现中定义类型可以解决错误:

代码语言:javascript
复制
module type MonoidADT = sig
  type 'a monoid = Monoid of ('a list) * ('a -> 'a -> 'a) * ('a)
(* . . . *)
end

module Monoid : MonoidADT = struct
  type 'a monoid = Monoid of ('a list) * ('a -> 'a -> 'a) * ('a)
(* . . . *)
end

但是如果我想给出一个不同的实现呢?非抽象签名限制了我对具体模块的定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74252277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档