Проверьте это , как кто-то предложил.
Я думаю, что короткий ответ состоит в том, чтобы передать словари операций (как это сделал бы Хаскелл, свидетель по делу).
Или измените дизайн, чтобы вам не нужны классы типов. (Это всегда кажется болезненным, так как классы типов - лучшая вещь в мире, и их трудно оставить позади, но до появления Haskell и классов типов люди все же умудрились программировать в течение 4 десятилетий ранее без классов типов, так что делают то же самое, что делали эти люди .)
Вы также можете получить небольшие способы с inline
статическими ограничениями членов, но это быстро становится ужасно.
Вот пример словаря операций:
// type class
type MathOps<'t> = { add : 't -> 't -> 't; mul: 't -> 't -> 't } //'
// instance
let mathInt : MathOps<int> = { add = (+); mul = (*) }
// instance
let mathFloat : MathOps<float> = { add = (+); mul = (*) }
// use of typeclass (normally ops would the 'constraint' to the left of
// the '=>' in Haskell, but now it is an actual parameter)
let XtimesYplusZ (ops:MathOps<'t>) x y z = //'
ops.add (ops.mul x y) z
printfn "%d" (XtimesYplusZ mathInt 3 4 1)
printfn "%f" (XtimesYplusZ mathFloat 3.0 4.0 1.0)