【发布时间】:2012-03-26 07:41:41
【问题描述】:
我正在尝试在 F# 中模拟类型类系统;我想创建对打印机,它会自动实例化对打印功能的正确调用系列。我粘贴在这里的最新尝试失败了,因为 F# 无法识别正确的重载并立即放弃:
type PrintableInt(x:int) =
member this.Print() = printfn "%d" x
let (!) x = PrintableInt(x)
type Printer() =
static member inline Print< ^a when ^a : (member Print : Unit -> Unit)>(x : ^a) =
(^a : (member Print : Unit -> Unit) x)
static member inline Print((x,y) : 'a * 'b) =
Printer.Print(x)
Printer.Print(y)
let x = (!1,!2),(!3,!4)
Printer.Print(x)
有什么办法吗?我是在游戏开发的环境中这样做的,所以我无法承受反射、重新输入和动态转换的运行时开销:要么我通过内联静态地这样做,要么根本不这样做:(
【问题讨论】:
-
递归需要走多少层——你可以写一个额外的打印函数
-
另请注意,递归内联函数根本不允许(至少在
let绑定中,member可能相同) -
老实说:我真的很喜欢 Typeclasses(无论如何在 CLR 中都不是完全支持的)-但这种情况只是您通常的接口定义-对 Tuple-class 进行扩展,然后您'很好去 - 顺便说一句:这永远不会编译,因为这里的元组没有“打印”成员 - 在顶部:如果你需要这个来提高性能......那么不要在方法调用之后链接方法调用只是为了做某事这个直截了当