Я все время решаю что-то похожее на проблему наследования алмазов (но без какого-либо наследования!) Следующим образом:
type I<'a> =
abstract member Foo : 'a
type a =
| A
interface I<a> with
member this.Foo = this
type b =
| B
interface I<b> with
member this.Foo = this
Общность между типами a
и b
раскрывается через интерфейс I<_>
, но члены интерфейса могут возвращать значения определенных базовых типов a
или b
, вместо того, чтобы обобщать любой тип, реализующий интерфейс.
Например, это возвращает значение типа a
:
> (A :> I<_>).Foo;;
val it : a = A
и это возвращает значение типа b
:
> (B :> I<_>).Foo;;
val it : b = B
, хотя значения были переданы в тип интерфейса.
Есть имя для этого? Другие люди делают это?