如何在F#中为T []定义类型扩展?

时间:2012-08-06 21:25:03

标签: c# arrays f# extension-methods

在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#中有什么权利这样做?

当然,我可以通过掩盖阵列模块并为此轻松添加功能来实现这一点,但我真的想知道如何将其作为扩展方法!

2 个答案:

答案 0 :(得分:27)

你必须使用'反引号'来编写数组类型 - 就像这样:

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[]" #)

答案 1 :(得分:10)

好问题。我无法弄清楚如何扩展'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