簡體   English   中英

如何在F#中為T []定義類型擴展?

[英]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 withtype array<'a> withtype '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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM