F# 如何解决关于out和tuple表单的互操作问题?

F# 如何解决关于out和tuple表单的互操作问题?,f#,F#,我在F中做了一个函数 let tryParseArray tryParse (separator:char) (line: string) = // inside the function I use the tuple form of tryParse 如果我这样称呼它,它可以正常工作:tryparserray Int32.TryParse',2,3,2,3,2 现在,我希望此函数在C中也可用,因此我做了以下操作: static member TryParseArray (line,

我在F中做了一个函数

let tryParseArray tryParse (separator:char) (line: string) =
    // inside the function I use the tuple form of tryParse
如果我这样称呼它,它可以正常工作:tryparserray Int32.TryParse',2,3,2,3,2

现在,我希望此函数在C中也可用,因此我做了以下操作:

static member TryParseArray (line, tryParse, separator) =
    line |> tryParseArray tryParse separator
然后我意识到tryparserray实际上将tryParse参数作为FSharpFunc,这对C一点都不友好,所以我尝试了以下方法:

static member TryParseArray (line, [<Out>] tryParse: (string * byref<'a> -> bool), separator) =
    line |> tryParseArray tryParse separator
但是现在tryparserray不接受tryParse作为有效的参数类型错误

我该怎么办


我希望在C中我可以调用tryparserray2,3,2,3,2,Int32.TryParse,','以及

您可以使用自定义委托类型向C公开此函数:

编辑


注意:在C端,您需要显式地为TryParse指定type参数

您可以使用自定义委托类型向C公开此函数:

编辑


注意:在C端,您需要显式地为TryParse指定type参数

desco的解决方案很好,但是如果您想避免byref,您可以这样做:


键入TryParsedesco的解决方案很好,但如果您想避免byref,可以执行以下操作:


键入TryParse+1以显示如何在委托param.thx上放置[]属性,这基本上解决了我的问题。但是,在F中,我不能让r=Lib.T.TryParse1,2,3,int.TryParse,','作为一个边查询,有什么解决方法吗?我知道我可以直接调用tryparseraraylib.T.TryParse 1,2,3,fun-sr->System.Int32.TryParses,r','?那不行。我可以制作另一个专门用于F重载的TryParse,只是想知道是否有更简单的选项+1来显示如何将[]属性放在delegate param.thx上,这基本上解决了我的问题。但是,在F中,我不能让r=Lib.T.TryParse1,2,3,int.TryParse,','作为一个边查询,有什么解决方法吗?我知道我可以直接调用tryparseraraylib.T.TryParse 1,2,3,fun-sr->System.Int32.TryParses,r','?那不行。我可以为F专门的重载制作另一个TryParse,只是想知道是否有更简单的替代方法
// F#
module Lib

let tryParseArray parser (line : string) (sep : char) = 
    // don't know your exact implementation so again just guessing...
    line.Split sep
    |> Array.choose (fun el ->
        match parser el with
        | true, el -> Some el
        | false, _ -> None
        )

open System.Runtime.InteropServices
type TryParse<'R>  = delegate of str : string * [<Out>] res : byref<'R> -> bool

type T = 
    static member TryParse(line : string, tryParse : TryParse<'R>, separator : char) : 'R[] = 
        tryParseArray tryParse.Invoke line separator


 //C# 
 var r = Lib.T.TryParse<int>("1,2,3", int.TryParse, ',');