是否可以在 F# 中为参数化泛型类型定义扩展方法(就像在 C# 中一样)
Is it possible to define extension methods for parameterized generic types in F# (like in C#)
在 C# 中,我可以定义一个扩展方法,该方法仅适用于参数化泛型类型:
public static bool fun(this List<int> coll, int x)
{
return coll.Contains(x);
}
我在 F# 中尝试了同样的方法,但发现没有办法:
type List<'k when 'k :> int32> with
member o.x s = o.Contains s
这提高了
错误 FS0660:此代码的通用性低于其注释所要求的,因为无法泛化显式类型变量 'k'。它被限制为 'int32'.
当然可以定义一个通用的扩展方法,比如
type List<'k> with
member o.x s = o.Contains s
并附注使该扩展方法在 C# 中可用。但这不是这里的问题。我担心 参数化 泛型函数。我认为这只能在 C# 中声明,而不能在 F# 中声明。
我的结论是,在 C# 中扩展方法是函数,而在 F# 中实现了类似的概念,因为类型扩展和参数化泛型不是类型,所以这是不可能的。
我说的对吗,在 F# 中无法执行相同的操作?
这里有一个类似的问题:Is it possible to define a generic extension method in F#?但是11年过去了,我再次提出这个话题。
F# 具有定义“C# 兼容”扩展的机制,并且您的用例是专门调用的,请检查 here。
像这样的东西应该可以工作:
open System.Collections.Generic
open System.Runtime.CompilerServices
[<Extension>]
type Extensions =
[<Extension>]
static member inline ContainsTest(xs: List<int>, s: int) =
xs.Contains(s)
在 C# 中,我可以定义一个扩展方法,该方法仅适用于参数化泛型类型:
public static bool fun(this List<int> coll, int x)
{
return coll.Contains(x);
}
我在 F# 中尝试了同样的方法,但发现没有办法:
type List<'k when 'k :> int32> with
member o.x s = o.Contains s
这提高了 错误 FS0660:此代码的通用性低于其注释所要求的,因为无法泛化显式类型变量 'k'。它被限制为 'int32'.
当然可以定义一个通用的扩展方法,比如
type List<'k> with
member o.x s = o.Contains s
并附注使该扩展方法在 C# 中可用。但这不是这里的问题。我担心 参数化 泛型函数。我认为这只能在 C# 中声明,而不能在 F# 中声明。
我的结论是,在 C# 中扩展方法是函数,而在 F# 中实现了类似的概念,因为类型扩展和参数化泛型不是类型,所以这是不可能的。
我说的对吗,在 F# 中无法执行相同的操作?
这里有一个类似的问题:Is it possible to define a generic extension method in F#?但是11年过去了,我再次提出这个话题。
F# 具有定义“C# 兼容”扩展的机制,并且您的用例是专门调用的,请检查 here。
像这样的东西应该可以工作:
open System.Collections.Generic
open System.Runtime.CompilerServices
[<Extension>]
type Extensions =
[<Extension>]
static member inline ContainsTest(xs: List<int>, s: int) =
xs.Contains(s)