Неизменные поля в различном союзе - PullRequest
4 голосов
/ 09 сентября 2011

Я знаю, что можно добавлять методы и свойства в различимые объединения, но вы можете добавить неизменяемое поле, которое должно быть установлено при создании экземпляра объединения, так же, как поля в записи?

Полагаю, мне хотелось бы объединить тип объединения и тип записи, например:

type union =
    | OptionOne of int
    | OptionTwo of string
    {
        AFieldUsedForBothCases : string
    }

, которая не является действительной декларацией.

Я знаю, что это можно решить, создав тип записи:

type record =
    {
        AFieldUsedForBothCases : string
        TheDiscriminatedUnion : union
    }

но я бы хотел сделать что-то похожее на первый пример, если это возможно.

Ответы [ 3 ]

5 голосов
/ 09 сентября 2011

Нет, я так не думаю, но вы можете добавить его к обоим случаям и извлечь его с помощью члена:

type union =
    | OptionOne of int * string
    | OptionTwo of string * string
    member u.AFieldUsedForBothCases =
        match u with
        | OptionOne (_,s) | OptionTwo(_,s) -> s

В конце вы все равно должны указать дополнительный элемент в своем конструкторе.Хорошо, этот позволит вам повторно напечатать общий элемент в каждом конструкторе, но я думаю, что это не так уж и плохо.

3 голосов
/ 09 сентября 2011

Я думаю, что это более точное решение

type union=
|a of int
|b of string

type Realtype = string * union

Благодаря проверке типа вы можете принудительно установить настройку свойства, и я думаю, что это немного лучше, чем решение для записи

1 голос
/ 09 сентября 2011

Я не думаю, что это возможно.Помимо формы, которую, я думаю, ваш второй код (с использованием записей) имеет гораздо больше смысла, потому что DU - это «или то, или это, или это ...», теперь, если между всеми этими случаями есть что-то общее, я бы оставил это общеевне DU, а не внутри DU.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...