我有很多不同的类型,它们有共同的目的,但没有什么共同点。为了解释起见,它们也可能是这样的:
type blah<'a> = Blah of 'a
type huha<'a> = Huha of 'a
我经常需要重复一大块样板文件,这些样板文件可以按照以下方式进入函数内部:
let f (x:something<int>) (g:something<char> -> float) : float =
但这需要以某种方式强制类型中的两个东西是相同的。换句话说,我希望能够将函数 f 称为:
f (Blah 1) (fun (b:blah<float>) -> .... )
f (Huha 1) (fun (b:huha<float>) -> .... )
显然,一个简单的解决方案是为函数 f 可能采用的所有类型创建一个可区分的联合,并让每个 g(即 f 的第二个参数)检查它是否获得了预期的任何类型。但这意味着拥有一个庞大的类型,每次发生任何变化时都会导致 Universe 重新编译,而且在运行时检查类型也没有多大帮助。
那么,有人可以看看以类型安全的方式做我想做的事吗?非常感谢。