我正在尝试编写扩展名'T,基本上是C#中的以下内容:
public static T With<T>(this T pObject, Action<T> pAction)
{
pAction(pObject);
return pObject;
}
Run Code Online (Sandbox Code Playgroud)
我试着把它翻译成F#:
[<Extension>]
type Ext =
[<Extension>]
static member With<'T>(pObject: 'T, pAction: Action<'T>): 'T =
pAction.Invoke(pObject);
pObject;
Run Code Online (Sandbox Code Playgroud)
和
module Extensions =
type 'T with
member this.With(pAction: Action<'T>): 'T = Ext.With(this, pAction);
Run Code Online (Sandbox Code Playgroud)
但是这会产生错误"Unexpected keyword",其中包含'in type name.在最后一个片段中.
搜索返回了这个,但它显然只适用于数组类型:如何在F#中为T []定义类型扩展?
如何扩展泛型类型'T,还是有任何解决方法?
您似乎可以按如下方式完成此操作:
open System.Runtime.CompilerServices
[<Extension>]
type Ext =
[<Extension>]
static member With(obj, act) =
act(obj)
obj
// example of usage
"a".With(fun s -> printfn "%s" s).With(fun s-> printfn "%s" (s + "2"))
Run Code Online (Sandbox Code Playgroud)
您根本不需要显式类型(通用或其他).F#将根据方法的主体推断出必要的类型.
当然,你可以用更F#的方式完成这个,而不使用扩展:
let withval =
fun act value ->
act(value)
value
// example of usage
"a"
|> withval (fun s -> printfn "%s" s)
|> withval (fun s-> printfn "%s" (s + "2"))
Run Code Online (Sandbox Code Playgroud)