假设有一类受歧视的工会,例如:
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
尽管他们内部支持比较。我想做的就是确保它们可以相互比较,而不必实施大量的“冗余”比较逻辑。
答案 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]
在某些情况下使用界面可能有意义,但这在很大程度上取决于用例。因此,对于动物的一个例子,这可能是最合理的方法。