F#函数类型的扩展方法

时间:2014-04-25 11:54:06

标签: f# type-extension

关于Type Extensions的MSDN文档声明"在F#3.1之前,F#编译器不支持使用带有泛型类型变量,数组类型,元组类型或类型的C#样式扩展方法F#函数类型为“this”参数。" (http://msdn.microsoft.com/en-us/library/dd233211.aspx) 如何在F#函数类型上使用类型扩展?在什么情况下这样的功能会有用?

2 个答案:

答案 0 :(得分:6)

以下是如何做到这一点:

[<Extension>]
type FunctionExtension() =
    [<Extension>]
    static member inline Twice(f: 'a -> 'a, x: 'a) = f (f x)

// Example use
let increment x = x + 1
let y = increment.Twice 5  // val y : int = 7

现在对于“在什么情况下这样的功能会有用?”,老实说我不知道​​,我认为这样做可能是一个坏主意。对函数调用方法感觉太像JavaScript了,在F#中根本不是惯用语。

答案 1 :(得分:1)

您可以使用F#的.运算符模拟扩展方法的|>表示法。考虑到需要括号,它有点笨拙:

let extension f x =
    let a = f x
    a * 2

let f x = x*x

> f 2;;
val it : int = 4
> (f |> extension) 2;;
val it : int = 8
> let c = extension f 2;;  // Same as above
val c : int = 8