【发布时间】:2020-10-19 03:17:49
【问题描述】:
假设我有一些类型
type A = { ... }
type B = { ... }
type AB = A of A | B of B
type Ainfo = { //some additional information about A
...
}
type Binfo = { //some additional information about B
...
}
type ABinfo = Ainfo of Ainfo | Binfo of Binfo
并且有一个函数适用于这些类型 - 它接受可以是 A 或 B 的“实体”以及有关该实体的一些附加信息。
let myFunc (entity: AB) (info: ABinfo) = ...
如何执行编译器限制以避免使用实体 A 和信息 Binfo 调用“myFunc”,反之亦然?
PS这个问题与我的另一个问题Extend type in F#
有关【问题讨论】:
-
如果您尝试将
A与Binfo一起传递会发生什么?我知道你会说“它不应该编译”,但是我的下一个问题是:如果你甚至不知道在编写程序时传递了什么怎么办?例如,假设函数的两个参数最终来自用户输入。在这种情况下,在用户输入它们之前,您无法知道它们将是什么。那么如果用户输入了错误的组合会发生什么? -
@FyodorSoikin 在这种情况下会有例外
-
好吧,如果你对异常没问题,那么只需让你的函数检查输入是否匹配,如果不匹配则抛出异常。