4

我有很多不同的类型,它们有共同的目的,但没有什么共同点。为了解释起见,它们也可能是这样的:

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 重新编译,而且在运行时检查类型也没有多大帮助。

那么,有人可以看看以类型安全的方式做我想做的事吗?非常感谢。

4

1 回答 1

2

据我了解,您不能直接在 F# 中执行此操作。

但也许运算符重载会有所帮助。但是,您必须f为每种类型实现。但也许你可以委托给一个通用的实现。

运算符重载的代码示例,确保正确的类型:

type T<'a> =
   | T of 'a
   static member (.+.) (l:T<int>, r:T<char> -> float) = 42.0

type U<'a> =
   | U of 'a
   static member (.+.) (l:U<int>, r:U<char> -> float) = 13.1


let ft (t:T<char>) = 42.0

let fu (t:U<char>) = 42.0

let t = T 42 .+. ft
let u = U 13 .+. fu

// does not compile:
let wrong = T 42 .+. fu
于 2012-07-28T11:07:29.287 回答