当前位置:  开发笔记 > 编程语言 > 正文

如何使用静态解析的类型参数解析递归映射中的奇怪类型错误?

如何解决《如何使用静态解析的类型参数解析递归映射中的奇怪类型错误?》经验,为你挑选了1个好方法。

在我看来,你想做这样的事情:

    ...

    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中还有很多东西需要解决.



1> Gus..:

在我看来,你想做这样的事情:

    ...

    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中还有很多东西需要解决.


你是对的,它在扩展方法中不起作用,但如果它们在同一个文件中,它们不会被编译为扩展方法.
推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有