Ограничения типов F# и разрешение перегрузки

Я пытаюсь эмулировать систему классов типов в 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)

Есть ли способ сделать это? Я делаю это в контексте разработки игр, поэтому я не могу позволить себе накладные расходы во время выполнения на отражение, перепечатку и динамическое приведение: либо я делаю это статически через встраивание, либо не делаю этого вообще :(

5
задан Giuseppe Maggiore 26 March 2012 в 07:41
поделиться