在我看来,你想做这样的事情:
... static member inline PrintArg(_: ArgsPrinter, t: CudaAr2D) = sprintf "float *%s" t.Name static member inline PrintArg(_: ArgsPrinter, t: CudaAr2D ) = sprintf "int *%s" t.Name let inline print_arg x = let inline call (tok : ^T) = ((^T or ^in_) : (static member PrintArg: ArgsPrinter * ^in_ -> string) tok, x) call ArgsPrinter type ArgsPrinter with static member inline PrintArg(_: ArgsPrinter, (x1, x2)) = [|print_arg x1;print_arg x2|] |> String.concat ", " static member inline PrintArg(_: ArgsPrinter, (x1, x2, x3)) = [|print_arg x1;print_arg x2;print_arg x3|] |> String.concat ", "
您可以在类型的中间定义泛型函数,因为您将使用它来进行最后两次重载,这将成为"递归重载".
请注意,这是FSharpPlus中当前使用的技术,实际上是该技术的简化.
最后请注意,你的解决方案对我来说似乎也是正确的(虽然更冗长)但由于某些原因F#编译器感到困惑,我无法解释你为什么但是遇到了很多情况,比如这一个,我能做的就是找到一个最小的repro ,一个解决方法,并报告给F#家伙.在Constraint Solver中还有很多东西需要解决.
在我看来,你想做这样的事情:
... static member inline PrintArg(_: ArgsPrinter, t: CudaAr2D) = sprintf "float *%s" t.Name static member inline PrintArg(_: ArgsPrinter, t: CudaAr2D ) = sprintf "int *%s" t.Name let inline print_arg x = let inline call (tok : ^T) = ((^T or ^in_) : (static member PrintArg: ArgsPrinter * ^in_ -> string) tok, x) call ArgsPrinter type ArgsPrinter with static member inline PrintArg(_: ArgsPrinter, (x1, x2)) = [|print_arg x1;print_arg x2|] |> String.concat ", " static member inline PrintArg(_: ArgsPrinter, (x1, x2, x3)) = [|print_arg x1;print_arg x2;print_arg x3|] |> String.concat ", "
您可以在类型的中间定义泛型函数,因为您将使用它来进行最后两次重载,这将成为"递归重载".
请注意,这是FSharpPlus中当前使用的技术,实际上是该技术的简化.
最后请注意,你的解决方案对我来说似乎也是正确的(虽然更冗长)但由于某些原因F#编译器感到困惑,我无法解释你为什么但是遇到了很多情况,比如这一个,我能做的就是找到一个最小的repro ,一个解决方法,并报告给F#家伙.在Constraint Solver中还有很多东西需要解决.