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

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

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.

Ответы

Ответ 1

Компилятор 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() для печати.

Ответ 2

Из того, что я понимаю, единственный тип дискриминационного типа с единственным случаем, чтобы предоставить имя, которое семантически относится к вашему проблемному домену, к другому типу обратной цели общего назначения, чье имя является "строкой".

Это исправление утечки света абстракции для семантики, и только это, AFAIK