Цель единого случая дискриминации
Я определяю монадический наблюдаемый/реактивный парсер. Это ведет себя по-разному к обычным парсером, поскольку это непрерывный запрос. Основной тип:
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