Цель единого случая дискриминированного союза
Я определяю монадный наблюдаемый / реактивный парсер. Это ведет себя совершенно иначе, чем обычный синтаксический анализатор, поскольку это непрерывный запрос. Базовый тип:
IObservable<'a> -> IObservable<'b>
Из рассмотрения различных реализаций синтаксического анализатора на функциональных языках кажется, что более подходящим способом определения вещей является единичный дискриминируемый союз:
type Pattern<'a,'b> = Pattern of (IObservable<'a> -> IObservable<'b>)
Что означает, что мне нужно извлечь основную функцию, чтобы использовать ее:
let find (Pattern p) = p
Вопрос заключается в следующем: это просто по соглашению или в целях последующего расширения, или есть ли причина для этого, даже если определение никогда не меняется?
Дополнительный вопрос: если это просто для более удобной подписи типа, почему бы просто не использовать псевдоним типа:
type Pattern<'a,'b> = IObservable<'a> -> IObservable<'b>
Я продвинулся довольно далеко через это, и не нашел случая, когда на компоновку влияет отсутствие использования DU.
2 ответа
Компилятор F# не сохраняет информацию об аббревиатуре типов, поэтому вы вообще не извлекаете выгоду из вывода типов. Подпись типа может пониматься как спецификация программы; позволить проверке типов выполнять свою работу - хороший способ убедиться в правильности ваших программ.
Вам необходимо явно указывать аннотацию типа везде в случае псевдонима типа:
type Vector = float * float
// val add : float * float -> float * float -> Vector
let add ((x1, y1): Vector) ((x2, y2): Vector): Vector = (x1 + y1, x2 + y2)
но это не дает вам прозрачности при использовании DU:
type Vector = V of float * float
// val add : Vector -> Vector -> Vector
let add (V(x1, y1)) (V(x2, y2)) = V(x1 + y1, x2 + y2)
В сложных программах четкие подписи типов действительно облегчают поддержание компоновки.
Мало того, что проще добавлять больше падежей к единичным DU, но также проще расширять DU с помощью членов и статических методов. Один из примеров - вы часто отменяете ToString()
для красивой печати.
Из того, что я понимаю, существует объединенный тип единого регистра для предоставления имени, который семантически релевантен вашему проблемному домену, для другого типа общего назначения общего назначения, имя которого - "строка".
Это исправление утечки легкой абстракции для семантики, и только это, AFAIK