haskell中的类型与数据性能

haskell中的类型与数据性能,haskell,types,Haskell,Types,我在Haskell中找到了解释newtype和data之间差异的答案。但如果我有以下类型的同义词: type Point = (Int,Int) 这是否比使用: data Point = Pt (Int,Int) ? 使用类型将更有效,因为它比数据版本产生的间接寻址少一个 请注意,两者的效率都比: data Point = Point {-# UNPACK #-}!Int {-# UNPACK #-}!Int 从上一个问题可以看出。是 Pt结构增加一个字的开销(GHC),字段(即对)存储为

我在Haskell中找到了解释
newtype
data
之间差异的答案。但如果我有以下类型的同义词:

type Point = (Int,Int)
这是否比使用:

data Point = Pt (Int,Int) ?

使用
类型
将更有效,因为它比
数据
版本产生的间接寻址少一个

请注意,两者的效率都比:

data Point = Point {-# UNPACK #-}!Int {-# UNPACK #-}!Int
从上一个问题可以看出。

Pt结构增加一个字的开销(GHC),字段(即对)存储为指向对的指针,增加一个额外的字,总共增加两个字的开销(以及一个额外的间接获取值)

我建议您要么使用类型同义词,要么更好地使用define

data Point = Pt {-# UNPACK #-} !Int {-# UNPACK #-} !Int
这需要少于4个单词

type Point = (Int, Int)

并且使用了更少的间接指令(指针)。

请参阅,特别是表示部分。在提出这个问题之前,我检查了这个问题。另一个问题是关于
newtype
data
之间的差异,而不是
type
data
之间的差异,在
data Point=Pt(Int,Int)
中用一对(,)包装数据构造函数Pt是低效的。最好使用
数据点=Pt Int
。在某些情况下,您可能也会选择严格整数。@stephen:这与类型同义词相比如何?不知道这是否更有效,为什么不是语言中的默认值更改了语义,使一些程序无法实现。默认值/=最有效。相反,是最一般的。除了一些例外(注意
length
verses
genericllength
),我说
data Point=Point{-#UNPACK}对吗!(Int,Int)
即单个构造函数优于
数据点=点{-#UNPACK}!Int{-#解包{-}!Int
?不,这是一种更糟糕的表示,因为元组仍然是指向Int的一对指针。请参见上面的数据表示链接。