我想定义一个受歧视联盟的所有成员共享的方法。目前,我已经像这样实现了它,但是看起来确实不太优雅-当然有更好的方法。有什么建议吗?

type A =
   {AData:string}
   member this.SharedMethod (x:float) : int= ...
type B =
   {BData:float}
   member this.SharedMethod (x:float) : int= ...
type AB =
| A of A
| B of B

let CallSharedMethod (ab:AB) x =
   match ab with
   | AB.A(a') -> a'.SharedMethod x
   | AB.B(b') -> b'.SharedMethod x

最佳答案

那这样的东西呢?

type AB =
    | A of string
    | B of float

    member self.SharedMethod (x : float) =
        match self with
        | A s -> x
        | B f -> f + x


假定您希望求和类型的每个变体(也称为区别联合)对float参数做不同的事情。

对于A的情况,我只返回原始值,因为我无能为力了(因为stringfloat之间通常没有有用的关系产生float)。

10-05 20:17
查看更多