如何创建扩展方法(F#)?

时间:2009-10-06 03:49:24

标签: f# extension-methods

如何在F#中创建扩展方法,例如,像C#扩展名:

    public static string Right(this string host, int index)
    {
        return host.Substring(host.Length - index);
    }

2 个答案:

答案 0 :(得分:21)

对于可以从F#调用的F#扩展名:

type System.String with
  member x.Right(index) = x.Substring(x.Length - index)

请注意,从Beta 1开始,这不会导致与C#兼容的扩展方法。

要生成从C#可见的扩展方法(但不能用作F#中的扩展方法),请参阅Brian编辑原始帖子中的链接。

答案 1 :(得分:3)

我知道这并没有真正回答你的问题,但值得指出。在F#和其他函数式语言中,您经常会看到具有静态方法的模块(如Seq模块),这些模块旨在与其他函数组合。据我所见,实例方法不易组合,这就是存在这些模块的原因之一。对于此扩展,您可能希望向String模块添加一个函数。

module String =
    let right n (x:string) =
        if x.Length <= 2 then x
        else x.Substring(x.Length - n)

然后就会这样使用。

"test"
|> String.right 2 // Resulting in "st"

["test"; "test2"; "etc"]
|> List.map (String.right 2) // Resulting in ["st"; "t2"; "tc"]

虽然在这种情况下扩展方法不会有更多代码。

["test"; "test2"; "etc"]
|> List.map (fun x -> x.Right 2)