f# - 单案例区分联合的目

  显示原文与译文双语对照的内容
0 0

我定义一个monadic observable/reactive分析程序。 此行为完全不同常规解析器,这是一次连续查询。 基础类型是:

IObservable<'a> -> IObservable<'b>

从看各种解析器实现在函数语言中,它似乎是更合适的方式来定义事物是单个case差别联合(discriminatedUnion) :

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个回答

0 0

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)

但不给你透明度与使用DUs :

type Vector = V of float * float
// val add : Vector -> Vector -> Vector
let add (V(x1, y1)) (V(x2, y2)) = V(x1 + y1, x2 + y2)

在复杂的程序清除类型签名确实便于维护组合性。

不仅它更容易添加更多,也更容易扩展的情况下为single case DU DU与成员和静态方法。 一个例子就是经常重写 ToString()进行优质打印。

原作者:
0 0

据我所知单case差别联合(discriminatedUnion)类型有提供在语义上的名称与你的问题域,为否则通用后端类型,其名称是'字符串'。

它是一个可抽象泄漏修复的语义,并且只有的,afaik

原作者:
...