Haskell 哈斯克尔:代数数据与元组
或 在惯用的haskell中,哪一个是首选的?为什么我应该使用一个而不是另一个?Haskell 哈斯克尔:代数数据与元组,haskell,types,tuples,Haskell,Types,Tuples,或 在惯用的haskell中,哪一个是首选的?为什么我应该使用一个而不是另一个? 我不在乎表现 它似乎与功能没有什么区别,例如: type Ray = (Vector, Vector) 首选数据版本,因为它更清楚地表明了程序员的意图-通过创建一个新类型,您向所有人指出,这不仅仅是一个元组,而是一个有意义的语义实体,射线 这就使得可以进一步使用类型系统,使用自定义实例,用于瑞,并且在元组中不可能进行优化。 您也可以考虑两种组合的第三种选项: NeXyType < /C> < /P> trace
我不在乎表现 它似乎与功能没有什么区别,例如:
type Ray = (Vector, Vector)
首选
数据
版本,因为它更清楚地表明了程序员的意图-通过创建一个新类型,您向所有人指出,这不仅仅是一个元组,而是一个有意义的语义实体,射线
这就使得可以进一步使用类型系统,使用自定义实例,用于<代码>瑞<代码>,并且在元组中不可能进行优化。
您也可以考虑两种组合的第三种选项:<代码> NeXyType < /C> < /P>trace :: Ray -> …
trace (Ray x d) = …
-- OR
trace (x, d) = …
在我看来,代数数据类型用于有多个备选方案的情况,或者需要递归类型并包含其自身的情况。但对于这样的事情来说,这可能有点过头了
唐·斯图尔特指出,使类型与元组同义与直接使用元组类型相同;类型同义词没有自己的标识。因此,类型检查器将无法区分您的类型和元组,因此它无法检查您是否正在使用所需的类型。此外,它将具有与元组完全相同的实例
newtype
允许您使用与元组相同的底层类型;但是,对于类型检查器来说,它是一个单独的类型,具有单独的实例。我发现非常方便的第四种选择是记录:
newtype Ray = Ray (Vector, Vector)
它们基本上具有“正常”ADT的所有特征,但有一些额外的语法糖分。特别是,它们使获取值的部分修改副本变得更容易。的确,在某些情况下,记录是非常有限的,但是您可以进一步使用“改进版本”,如 对。关于类型的一个关键点是:它们不仅仅是数据的表示;它们描述了有用的结构。好的,这是有意义的<代码>类型实际上只是同义词,而不是新的数据类型。但是这条线必须画在某个地方-
typecolor=(Int,Int,Int)
是合适的,对吗?不,出于性能原因,为颜色使用压缩向量类型更有意义,就像在颜色包中一样——像这样有意义的类型可以优化和专门化。那么,元组的一个示例用法是什么呢?元组对于其他模块不可见的临时和中间数据类型,或者对于逻辑上相关但仅在模块中“支持参与者”的事物集合非常有用。这似乎不如使用curried表单那么常见。也许只是因为它更多的是标点符号。
newtype Ray = Ray (Vector, Vector)
data Ray = Ray { from, to :: Vector }