How to define a type extension for T[] in F#?

倾然丶 夕夏残阳落幕 提交于 2019-11-27 03:15:25

问题


In C#, I can define an extension method for a generic array of type T like this:

public static T GetOrDefault<T>(this T[] arr, int n)
{
    if (arr.Length > n)
    {
        return arr[n];
    }

    return default(T);
}

but for the life of me I can't figure out how to do the same in F#! I tried type 'a array with, type array<'a> with and type 'a[] with and the compiler wasn't happy with any of them.

Can anyone tell me what's the right to do this in F#?

Sure, I can do this by overshadowing the Array module and add a function for that easily enough, but I really want to know how to do it as an extension method!


回答1:


You have to write the array type using 'backtick marks' - like this:

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

Edit: The syntax type ``[]``<'a> with ... seems to be allowed as well. In the F# source (prim-types-prelude.fs) you can find the following definition:

type ``[]``<'T> = (# "!0[]" #)



回答2:


Good question. I can't figure out how to extend 'T[] but you can take advantage of the fact that arrays implement IList<_> to do:

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


来源:https://stackoverflow.com/questions/11836167/how-to-define-a-type-extension-for-t-in-f

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!