如何延长'T?

Seb*_*ann 0 generics f#

我正在尝试编写扩展名'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,还是有任何解决方法?

JLR*_*she 6

您似乎可以按如下方式完成此操作:

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)