[英]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# 中可用。但這不是這里的問題。 我擔心參數化泛型 function。我相信它只能在 C# 中聲明,但不能在 F# 中聲明。
我得出結論,在 C# 中,擴展方法是函數,而在 F# 中,類似的概念是作為類型擴展實現的,而參數化的 generics 是無類型的,所以這是不可能的。
我是否正確,在 F# 中沒有辦法做同樣的事情?
這里有一個類似的問題: Is it possible to define a generic extension method in F#? 但11年過去了,我再次提出這個話題。
F# 具有定義“C# 兼容”擴展的機制,並且您的用例被特別調出,請查看此處。
這樣的事情應該有效:
open System.Collections.Generic
open System.Runtime.CompilerServices
[<Extension>]
type Extensions =
[<Extension>]
static member inline ContainsTest(xs: List<int>, s: int) =
xs.Contains(s)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.