[英]How to define a type extension for T[] in F#?
在C#中,我可以為類型為T的泛型數組定義一個擴展方法,如下所示:
public static T GetOrDefault<T>(this T[] arr, int n)
{
if (arr.Length > n)
{
return arr[n];
}
return default(T);
}
但對於我的生活,我無法弄清楚如何在F#中做同樣的事情! 我嘗試type 'a array with
, type array<'a> with
並type 'a[] with
,編譯器對它們中的任何一個都不滿意。
誰能告訴我在F#中做這件事的權利是什么?
當然,我可以通過掩蓋陣列模塊並為此輕松添加功能來實現這一點,但我真的想知道如何將其作為擴展方法!
你必須使用'反引號'來編寫數組類型 - 像這樣:
type 'a ``[]`` with
member x.GetOrDefault(n) =
if x.Length > n then x.[n]
else Unchecked.defaultof<'a>
let arr = [|1; 2; 3|]
arr.GetOrDefault(1) //2
arr.GetOrDefault(4) //0
編輯 :似乎也允許語法type ``[]``<'a> with ...
在F#source(prim-types-prelude.fs)中,您可以找到以下定義:
type ``[]``<'T> = (# "!0[]" #)
好問題。 我無法弄清楚如何擴展'T[]
但你可以利用數組實現IList<_>
的事實:
type System.Collections.Generic.IList<'T> with
member x.GetOrDefault(n) =
if x.Count > n then x.[n]
else Unchecked.defaultof<'T>
let arr = [|1; 2; 3|]
arr.GetOrDefault(1) //2
arr.GetOrDefault(4) //0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.