f# - 有没有办法使用 sum 类型的 case 作为另一种类型的类型参数?
问题描述
有什么办法可以做到以下几点:
type First = |A |B
type Second = |C of First |D of A
在上述情况下,我想指定 D 使其只能包含 aFirst
类型A
而不是 any First
。有什么办法可以在声明中强加这个约束?
解决方案
在您的示例中,A
是一个联合案例,它是一个值,而不是一个类型。但是每个案例的内容都需要一个类型,这就是代码没有意义的原因。出于同样的原因,您不能创建一个接受类型值的函数,A
因为它不是类型。让我们解决这个问题。
假设案例A
包含一些数据(A of int list list
)。您可以使用类型别名为int list list
. 然后您可以在其他地方重用类型名称:
type A = int list list
type First =
| A of A
| B
type Second =
| C of First
| D of A
现在您还可以编写一个接受 type 值的函数A
。
创建一个与它包含的类型具有相同名称的案例(例如A of A
)是一种常见的做法。只需清楚区分 caseA
和 type A
。
推荐阅读
- typeorm - typeorm 可以在应用程序启动时验证模式吗?
- image - 如何使用我的 SQLite 数据库中的路径显示本地存储的图像?
- java - Hibernate 只保留第一个嵌套实体
- javascript - 如何将 PHP 脚本放入 JS 中?
- django - 如何从 django 项目下载 .txt 文件
- java - 无法在邮递员中发布照片 - 无可用消息,邮递员中出现错误 404
- reactjs - 如何在每次 git rebase --continue 之后自动运行 bash 命令?
- javascript - 向不同域上的客户端公开 csrf 令牌
- ios - 发出 Firebase 身份验证 - Apple 使用隐藏电子邮件登录
- python - 将字符串和 int 转换为变量 Python