- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:我正在尝试创建论文中描述的内容,Data Type à la Carte - 但尝试查看 OCaml 的多态变体是否可以导致干净的 ReasonML 实现。
我这里的代码是 ReasonML 语法,但这个问题同样适用于 OCaml。
我首先为 Val
和 Add
定义了两个模块,它们都实现了 fmap
- 使它们成为 haskel 风格的仿函数。
module type Functor = {
type t('a);
let fmap: ('a => 'b, t('a)) => t('b);
};
module Val = {
type t('e) = [ | `Val(int)];
let fmap = _ =>
fun
| `Val(x) => `Val(x);
};
module Add = {
type t('e) = [ | `Add('e, 'e) ];
let fmap = f =>
fun
| `Add(x, y) => `Add((f(x), f(y)))
};
我可以很容易地创建一个 Algebra
数据类型,将这两个模块合二为一,使用非常简单的 fmap
实现。
module Algebra = {
type t('t) = [ Val.t('t) | Add.t('t)];
let fmap = (f, x) =>
switch (x) {
| #Val.t as v => Val.fmap(f, v)
| #Add.t as o => Add.fmap(f, o)
};
};
这可以在更大的上下文中编译和工作,我可以在其中计算由 Val
和 Add
值组成的表达式。
但是,作为一个不想编写样板代码的程序员,我的下一步是创建一个仿函数(OCaml 仿函数),它可以从任何两个兼容模块生成这样的模块。
我的第一次尝试是这样的:
module JoinAlgebra = (A1: Functor, A2: Functor) => {
type t('t) = [ A1.t('t) | A2.t('t)];
let fmap = (f, x) =>
switch (x) {
| #A1.t as v => Val.fmap(f, v)
| #A2.t as o => Add.fmap(f, o)
};
};
但这行不通。由于 A1.t
和 A2.t
可以是任何东西,我无法将它们组合为多态变体。
Error: The type A1.t('t) is not a polymorphic variant type
我尝试向 Functor
模块类型添加类型约束:
module type Functor = {
type t('a) = 'a constraint [> ] = 'a;
let fmap: ('a => 'b, t('a)) => t('b);
};
module JoinAlgebra = (A1: Functor, A2: Functor) => {
type t('t) = [ A1.t('t) | A2.t('t)]; // This line fails
}
现在我得到了编译器错误
Error: The type A1.t([> ]) is not a polymorphic variant type
有什么方法可以创建一个自动基于这两个模块的模块仿函数?
关于 OCaml 版本的注意事项:我在这里使用的是 bucklescript v. 5,它使用 OCaml 4.02 编译器。但也欢迎需要 4.06 的解决方案(Bucklescript 应该会支持)
最佳答案
您的Functor
签名定义了一个抽象类型'a t
。正如您正确指出的那样,“由于 A1.t 和 A2.t 可以是任何东西,我不能将它们组合为多态变体。”为了解决 Functor
中的 'a t
是抽象的问题,您尝试通过以下方式使其成为多态变体:
module Functor = struct
type 'a t = 'a constraint 'a = [< ]
end
但是,'a
类型变量不再代表包装值,而是代表多态变体约束。这当然不是你想要的。您收到错误 Error: The type A1.t([> ]) is not a polymorphic variant type
因为您只能将“精确变体类型”替换为多态变体:
The first case is an exact variant type: all possible tags are known, with their associated types, and they can all be present. Its structure is fully known.
...
In all three cases, tags may be either specified directly in the `tag-name [of typexpr] form, or indirectly through a type expression, which must expand to an exact variant type, whose tag specifications are inserted in its place.
( https://caml.inria.fr/pub/docs/manual-ocaml/types.html#polymorphic-variant-type )
您的 JoinAlgebra
不需要多态变体。只是做:
module JoinAlgebra (A1 : Functor) (A2 : Functor) = struct
type 't t = Left of 't A1.t | Right of 't A2.t
let fmap f x =
match x with
| Left v -> Left (A1.fmap f v)
| Right o -> Right (A2.fmap f o)
end
好处是 Functor
中的 'a t
仍然是抽象的,代码适用于未定义多态变体的 Functor
模块。
关于ocaml - 为具有泛型类型参数的多态变体编写类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55828648/
我可以添加一个检查约束来确保所有值都是唯一的,但允许默认值重复吗? 最佳答案 您可以使用基于函数的索引 (FBI) 来实现此目的: create unique index idx on my_tabl
嗨,我在让我的约束在grails项目中工作时遇到了一些麻烦。我试图确保Site_ID的字段不留为空白,但仍接受空白输入。另外,我尝试设置字段显示的顺序,但即使尝试时也无法反射(reflect)在页面上
我似乎做错了,我正在尝试将一个字段修改为外键,并使用级联删除...我做错了什么? ALTER TABLE my_table ADD CONSTRAINT $4 FOREIGN KEY my_field
阅读目录 1、约束的基本概念 2、约束的案例实践 3、外键约束介绍 4、外键约束展示 5、删除
SQLite 约束 约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。 约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整
我在 SerenityOS project 中偶然发现了这段代码: template void dbgln(CheckedFormatString&& fmtstr, const Parameters
我有表 tariffs,有两列:(tariff_id, reception) 我有表 users,有两列:(user_id, reception) 我的表 users_tariffs 有两列:(use
在 Derby 服务器中,如何使用模式的系统表中的信息来创建选择语句以检索每个表的约束名称? 最佳答案 相关手册是Derby Reference Manual .有许多可用版本:10.13 是 201
我正在使用 z3py 进行编码。请参阅以下示例。 from z3 import * x = Int('x') y = Int('y') s = Solver() s.add(x+y>3) if s.c
非常快速和简单的问题。我正在运行一个脚本来导入数据并声明了一个临时表并将检查约束应用于该表。显然,如果脚本运行不止一次,我会检查临时表是否已经存在,如果存在,我会删除并重新创建临时表。这也会删除并重新
我有一个浮点变量 x在一个线性程序中,它应该是 0或两个常量之间 CONSTANT_A和 CONSTANT_B : LP.addConstraint(x == 0 OR CONSTANT_A <= x
我在使用grails的spring-data-neo4j获得唯一约束时遇到了一些麻烦。 我怀疑这是因为我没有正确连接它,但是存储库正在扫描和连接,并且CRUD正在工作,所以我不确定我做错了什么。 我正
这个问题在这里已经有了答案: Is there a constraint that restricts my generic method to numeric types? (24 个回答) 7年前
我有一个浮点变量 x在一个线性程序中,它应该是 0或两个常量之间 CONSTANT_A和 CONSTANT_B : LP.addConstraint(x == 0 OR CONSTANT_A <= x
在iOS的 ScrollView 中将图像和带有动态文本(动态高度)的标签居中的最佳方法是什么? 我必须添加哪些约束?我真的无法弄清楚它是如何工作的,也许我无法处理它,因为我是一名 Android 开
考虑以下代码: class Foo f class Bar b newtype D d = D call :: Proxy c -> (forall a . c a => a -> Bool) ->
我有一个类型类,它强加了 KnownNat约束: class KnownNat (Card a) => HasFin a where type Card a :: Nat ... 而且,我有几
我知道REST原则上与HTTP无关。 HTTP是协议,REST是用于通过Web传输hypermedia的体系结构样式。 REST可以使用诸如HTTP,FTP等的任何应用程序层协议。关于REST的讨论很
我有这样的情况,我必须在数据库中存储复杂的数据编号。类似于 21/2011,其中 21 是文件编号,但 2011 是文件年份。所以我需要一些约束来处理唯一性,因为有编号为 21/2010 和 21/2
我有一个 MySql (InnoDb) 表,表示对许多类型的对象之一所做的评论。因为我正在使用 Concrete Table Inheritance ,对于下面显示的每种类型的对象(商店、类别、项目)
我是一名优秀的程序员,十分优秀!