haskell中的类型与数据性能
我在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),字段(即对)存储为
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
versesgenericllength
),我说data Point=Point{-#UNPACK}对吗!(Int,Int)
即单个构造函数优于数据点=点{-#UNPACK}!Int{-#解包{-}!Int
?不,这是一种更糟糕的表示,因为元组仍然是指向Int的一对指针。请参见上面的数据表示链接。