17

在 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> withtype 'a[] with

谁能告诉我在 F# 中这样做的权利是什么?

当然,我可以通过遮盖 Array 模块并轻松添加一个函数来做到这一点,但我真的很想知道如何将它作为扩展方法!

4

2 回答 2

31

您必须使用“反引号”编写数组类型 - 如下所示:

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# 源代码 (prim-types-prelude.fs) 中,您可以找到以下定义:

type ``[]``<'T> = (# "!0[]" #)
于 2012-08-07T15:38:09.507 回答
11

好问题。我不知道如何扩展'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
于 2012-08-06T21:33:13.040 回答