gpt4 book ai didi

generics - 是否可以在 F# 中为参数化泛型类型定义扩展方法(就像在 C# 中一样)

转载 作者:行者123 更新时间:2023-12-02 15:57:45 26 4
gpt4 key购买 nike

在 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)

关于generics - 是否可以在 F# 中为参数化泛型类型定义扩展方法(就像在 C# 中一样),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71203991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com