如何在F#中基于K和V扩展IStore<ValueTuple<K, V>>泛型类型?
在F#中扩展
IStore<ValueTuple<K, V>>类型的方法 问题背景
在C#中,可以通过以下扩展方法扩展IStore<ValueTuple<K, V>>类型:
public static void F<K, V>(this IStore<ValueTuple<K, V>> s, K k)
但在F#中尝试通过约束指定ValueTuple的方式无法生效,代码如下:
type IStore<'kv when 'kv :> ValueTuple<'k, int> > with member o.F(k: 'K) = 42
请问是否有办法在F#中实现该需求?
解决方案
F#中不能用继承约束(:>)限制ValueTuple,因为它是值类型。要实现类似C#的扩展,需直接针对IStore<ValueTuple<'K, 'V>>这个泛型类型定义扩展成员,正确写法有两种:
写法一:通过类型等式约束明确关联
open System type IStore<'kv> with member this.F<'K, 'V when 'kv = ValueTuple<'K, 'V>>(k: 'K) = // 替换为实际业务逻辑,示例返回42 42
写法二:直接指定目标泛型类型
open System type IStore<ValueTuple<'K, 'V>> with member this.F(k: 'K) = 42
两种写法都能让所有实现IStore<ValueTuple<K, V>>的实例调用F方法,效果和C#的扩展一致。
内容的提问来源于stack exchange,提问作者citykid
相关产品推荐
相关产品推荐

