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 に答える