订购扩大的歧视工会

时间:2016-02-20 12:08:57

标签: f# comparison discriminated-union

假设有一类受歧视的工会,例如:

type IAnimal =
    end interface

type Mammal =
    | Cat
    | Dog
    | Cow
    | Sheep
    interface IAnimal   

type Reptile =
    | Tortoise
    | Lizard
    | Snake
    | Crocodile        
    interface IAnimal

有人想要一组IAnimal,例如:

let animals = set [Cat :> IAnimal; Lizard :> IAnimal]

这将失败The type IAnimal does not support the 'comparison' constraint

可以通过继承IComparable中的IAnimal界面来解决此问题,但这会迫使我在CompareTo(obj)和{{1}中明确实施Mammal尽管他们内部支持比较。我想做的就是确保它们可以相互比较,而不必实施大量的“冗余”比较逻辑。

1 个答案:

答案 0 :(得分:4)

一种更为惯用的F#方式是定义另一种受歧视的联盟:哺乳动物或爬行动物:

type Mammal =
    | Cat
    | Dog
    | Cow
    | Sheep

type Reptile =
    | Tortoise
    | Lizard
    | Snake
    | Crocodile        

type Animal =
    | Reptile of Reptile
    | Mammal of Mammal

然后你可以创建一组动物,因为F#为你实现Animal联盟的比较:

let animals = set [Mammal Cat; Reptile Lizard]

在某些情况下使用界面可能有意义,但这在很大程度上取决于用例。因此,对于动物的一个例子,这可能是最合理的方法。