2015-07-27 4 views
4

У меня есть DU так:F # Подтип дискриминированных Союзы

type Food = 
| Beer 
| Bacon 
| Apple 
| Cherry 

Я хочу добавить характеристику ОУ к флагу, если пища плод или нет. Я сначала подумал, что-то вроде этого:

type NonFruit = NonFruit 
type Fruit = Fruit 

type Food = 
| Beer of NonFruit 
| Bacon of NonFruit 
| Apple of Fruit 
| Cherry of Fruit 

А потом способ, как это:

пусть fruitChecker (myFood: Food) = матч myFood с | :? NonFruit -> «Нет» | :? Плод -> «да»

Но компилятор кричит на меня:

Тип «Food» не имеет собственных подтипов и не могут быть использованы в качестве источника

Am Я неправильно подхожу к проблеме?

Thanks

+0

возможно дубликат [F # моделирование игральных карт] (http://stackoverflow.com/questions/29001670/f-modeling-playing-cards) –

ответ

3

Вы должны просто добавить функцию для этого. Если вы хотите сохранить его «закрыть» к типу, сделать его статический член:

type Food = 
    | Beer 
    | Bacon 
    | Apple 
    | Cherry 
    static member IsFruit = function Beer | Bacon -> false | Apple | Cherry -> true 

Think случаев ОУ как конструкторы - это имеет смысл передать имя пивоваренного завода в Beer конструктора, но является ли это плодом или нет, это статическое качество, которое здесь неуместно.

+0

Ключевое слово 'match' необходимо заменить на 'function' для компиляции. – Kevin

+0

@ Кевин: справа, отредактирован. – scrwtp

Смежные вопросы