Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔:代数数据与元组_Haskell_Types_Tuples - Fatal编程技术网

Haskell 哈斯克尔:代数数据与元组

Haskell 哈斯克尔:代数数据与元组,haskell,types,tuples,Haskell,Types,Tuples,或 在惯用的haskell中,哪一个是首选的?为什么我应该使用一个而不是另一个? 我不在乎表现 它似乎与功能没有什么区别,例如: type Ray = (Vector, Vector) 首选数据版本,因为它更清楚地表明了程序员的意图-通过创建一个新类型,您向所有人指出,这不仅仅是一个元组,而是一个有意义的语义实体,射线 这就使得可以进一步使用类型系统,使用自定义实例,用于瑞,并且在元组中不可能进行优化。 您也可以考虑两种组合的第三种选项: NeXyType < /C> < /P> trace

在惯用的haskell中,哪一个是首选的?为什么我应该使用一个而不是另一个?
我不在乎表现

它似乎与功能没有什么区别,例如:

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 }