我正在定义一个单子可观察/反应式解析器。这与普通解析器的行为完全不同,因为它是一个连续查询。底层类型是:
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 会影响可组合性的情况。