问题标签 [polymorphic-variants]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
types - 通配符模式覆盖多态变体的子类型约束
鉴于这些类型
和这个功能
正如预期的那样,应用类型的值a
没有问题:
但是,如果修改函数以包含通配符模式
即使其他一切都保持不变,它现在会产生以下错误(on let _ = pp a
):
此表达式的类型为 b -> 字符串,但预期的表达式类型为 a -> 'a Type b = [ `A | `B ] 与类型 a = [ `A ] 不兼容 第二个变体类型不允许标记 `B
问题:
- 为什么它不再能够接受子类型?我理解通配符意味着它现在可以接受超类型,但这不应该意味着它必须。
- 有没有办法解决这个问题,以避免枚举一百万左右不相关的变体?
module - ocaml 中作为模块/函子签名约束的变体类型
我正在尝试使用模块/函子来进行更通用的代码设计。为了简化,我有两个接口:
我想T2.t
用一个基于T1.t
.
在后者中,我收到以下错误:
但是,如果我使用多态变体,它似乎被接受:
但我显然不明白为什么。将此类约束与变体一起使用的正确方法是什么?
PS:注意这个也是被拒的
ocaml - 多态变体子类型实现与签名不匹配
我有以下代码:
您可能会注意到,抽象类型'a t
在其类型参数中被声明为协变'a
,而make
构造函数被声明为返回多态变体 case或的子类型。a
b
在我的实现中make
,返回子类型[a] t
仍应遵循协方差规则,因为子类型位于返回类型位置。
但是,我收到以下错误:
关于如何让 OCaml 相信该make
函数确实返回了 的有效子类型的任何建议[a | b] t
?
ocaml - 如何使 Ocaml 多态变体私有
我想将我的一些类型转换为使用 Ocaml 多态变体,将它们分解为开放递归,同时仍然保留我现有的私有非多态类型的执行,以及对模式匹配的详尽检查。
我的产品是一个编译器,因此类型集由各种算法更改,目前我必须包含所有构造函数,其中不应该出现“断言错误”的构造函数。
我应该补充一点,我曾经使用多态变体,但切换回普通变体,因为类型推断不能很好地与多态变体一起使用:错误消息很难阅读,而且它们比通常的错误推断错误得多,需要参数上的更多类型注释以保持任何理智。问题是没有它们,私有构造函数的执行很强大,但客户端算法的执行很弱。
我不确定将构造函数的“临时”子集与隐私相结合是否可能或实用。关于它的实用性有什么建议吗?
编辑:简单的示例类型:
使用开放递归,构造函数必须遵循类型的打开/关闭模式。客户只会看到封闭的版本。这意味着,与我当前的系统中单个构造函数就足够了,我现在需要一个用于每个封闭类型,每个包含构造函数的类型。
即使我能弄清楚如何做到这一点,如果你说 6 个相互依赖的类型都使用开放递归,这会导致可能的组合呈指数爆炸式增长,这也很难,但目前尚不清楚这是否是一个优势接受运行时检查。我花了大约 2 个小时来添加一个新的构造函数,因为每个模式匹配都会因穷举错误而失败,并且必须修复......即使新的构造函数在编译的那个阶段没有用。
types - 变体定义中的多态变体限制
假设我想在 OCaml 中建模一个简单的表达式类型:
是否可以限制其自身expr
的expr * expr
特定构造函数expr
(即我IntExpr
只想允许'Int')?我可以通过模式匹配来模仿这一点,但expr
扩展后会变得很麻烦。我可以以某种方式使用 OCaml 的类型系统来实现这一点吗?
我尝试使用多态类型上限如下:
但编译器不接受这个(带有 message In case IntAdd of [< Int ] * ([< Int ] as 'a) the variable 'a is unbound
)。有什么诀窍可以使这项工作吗?
ocaml - 沙丘utop和utop的区别
utop
如果我在之后加载以下代码#require "mparser"
,它会在顶层被接受并在下面给出签名
接受utop
为
现在,如果我尝试加载dune utop
包含此代码作为文件/模块的库,我收到以下错误:
看起来缺少一些类型注释。我对多态变体类型不太熟悉,有没有明显的解决方案?
我希望将签名部分粘贴utop
在界面中会起作用,但它似乎在.mli
文件中无效
编辑:简单的解决方案是添加封闭类型注释。
我不确定是否有理由说明交互式会话和dune utop lib
一次性加载的行为应该不同
ocaml - 是否可以使用模块动态创建多态变体类型?
我正在尝试组织和重用我的 reasonML 代码。我的模型模块类型如下所示:
我想从idType
s 和schemaType
s 生成一个类型和函数。
例子是:
所以我正在尝试使用函子来构造一个模块,将每个模式通过
上面的代码不起作用。我在将模块类型添加到顶部的模型模块时遇到问题。我也尝试过一个SchemaType
模块类型,但一直在点击The type idType is not a polymorphic variant type
,当我希望每个模型都有不同的多态变量类型时。
所以总的来说,我想知道是否可以创建一个可以使用模块和仿函数创建或扩展的多态变体类型?
如果不是,是否可以使用“模块列表”构造多态变体类型?
谢谢
module - 可以注释组合的多态变体类型吗?
我一直在使用多态变体来处理结果类型的错误(取自http://keleshev.com/composable-error-handling-in-ocaml),它非常适合详尽的检查。我最近遇到了在仿函数中注释结果类型的需要,但不确定是否可行。这是一个片段,对我要完成的工作有一些评论:
ocaml - ocaml 多态变体类型 推断类型太笼统
我有这个代码
它不会与消息一起编译
如果很明显 `X 永远不能从函数中返回,为什么编译器不能推断类型?[
Z |
Y]
pattern-matching - 使用 GADT 建模语法,但类型参数不会统一
我认为我找到了一种使用 GADT 对语法进行建模的巧妙方法,方法是给每个构造函数(例如Char
)一个返回类型参数,该参数是一个多态变体[`Char] t
(例如[<`Minus | `Char] t
)。
这按预期工作,只允许符合语法的序列:
但是,似乎不可能为这种类型编写任何微不足道的函数:
据我了解,多态变体并不统一,因为 GADT 类型参数不能有差异。这是否意味着这种方法完全没用?