如何基于泛型接口A<'t>定义嵌套泛型接口X?
正确实现F#嵌套泛型接口的方式
我懂你想要的效果——让接口X直接把A<'t>作为它的泛型参数,写成X<A<'t>>这种形式对吧?之前的两种写法要么不符合你想要的调用方式,要么语法本身就不对,下面给你讲正确的实现思路和代码:
首先,F#里要定义接受另一个泛型类型作为参数的高阶泛型接口,不能直接把A<'t>写在泛型参数列表里(像你第二种写法那样是语法错误,泛型参数必须是单个标识符),而是要通过类型约束来指定你的泛型参数必须是A<'t>的某个实例。
正确的代码实现
// 先保留原接口A<'t>的定义 type A<'t> = abstract Scratch: 't // 定义X接口:接受一个泛型参数'a,约束它是A<'t>的子类型('t会被自动推断) type X<'a when 'a :> A<'t>> = abstract f: 'a
如果你需要显式地在X的定义里引用t(比如接口里有其他成员需要用到t类型),可以改成这样:
type X<'t, 'a when 'a :> A<'t>> = abstract f: 'a abstract GetScratchValue: unit -> 't // 示例:用到't的成员
为什么之前的写法不行?
- 你的第一种写法
type X<'t,'y when 'y:A<'t>> = abstract f: 'y其实语法上是合法的,但它要求你调用时必须传入两个参数:X<int, A<int>>,而不是你想要的X<A<int>>,不符合你期望的嵌套泛型形式。 - 第二种写法
type X<'t,A<'t>> = abstract f: A<'t>是语法错误,因为泛型参数列表里只能放标识符(比如't、'a),不能直接写已有的泛型类型(比如A<'t>)。
使用示例
给你一个完整的使用例子,验证这个写法能正常工作:
// 实现A<int>的具体类型 type IntScratch() = interface A<int> with member _.Scratch = 42 // 实现X<A<int>> type MyXImpl() = interface X<A<int>> with member _.f = IntScratch() :> A<int> // 测试调用 let xInstance = MyXImpl() :> X<A<int>> printfn "Scratch value: %d" xInstance.f.Scratch // 输出:Scratch value: 42
内容的提问来源于stack exchange,提问作者Mohsen
相关产品推荐
相关产品推荐

