Цель единого случая дискриминированного союза

Я определяю монадный наблюдаемый / реактивный парсер. Это ведет себя совершенно иначе, чем обычный синтаксический анализатор, поскольку это непрерывный запрос. Базовый тип:

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

Другие вопросы по тегам