F#函数型的可拓方法

F#函数型的可拓方法,f#,type-extension,F#,Type Extension,类型扩展的MSDN文档声明“在F#3.1之前,F#编译器不支持使用C风格的扩展方法,将泛型类型变量、数组类型、元组类型或F#函数类型作为“this”参数。”() 如何在F#函数类型上使用类型扩展?在什么情况下,此功能会有用?以下是您可以使用的方法: [<Extension>] type FunctionExtension() = [<Extension>] static member inline Twice(f: 'a -> 'a, x: 'a)

类型扩展的MSDN文档声明“在F#3.1之前,F#编译器不支持使用C风格的扩展方法,将泛型类型变量、数组类型、元组类型或F#函数类型作为“this”参数。”()
如何在F#函数类型上使用类型扩展?在什么情况下,此功能会有用?

以下是您可以使用的方法:

[<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
[]
类型FunctionExtension()=
[]
静态成员内联两次(f:'a->'a,x:'a)=f(fx)
//示例使用
设增量x=x+1
设y=增量。两次5//val y:int=7

至于“在什么情况下,这样的功能会有用?”我真的不知道,而且我认为这样做可能是个坏主意。在函数上调用方法感觉太简单了,在F#中一点也不惯用。

您可以使用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

当有足够多的人开始做这件事时,这是一个习惯用语:-)