gpt4 book ai didi

haskell - 为什么使用 UNPACK 和严格标记记录字段很常见?

转载 作者:行者123 更新时间:2023-12-03 15:06:42 25 4
gpt4 key购买 nike

我注意到这种模式在 Haskell 库中很常见:

data Foo = Foo { field :: {-# UNPACK #-} !Sometype } 

例如 UNPACK设置字段的类型并使其严格。

我明白 pragma 和 annotation 的作用是什么,但我不明白为什么它如此普遍:我在 Haskell 中编程已有 15 年,很少使用严格注释,也从未使用过 UNPACK语用。

如果这个成语这么有用,为什么不让它不那么“丑”呢?

最佳答案

pragma 可能有点丑陋,但它避免了其他地方更多的丑陋。当性能至关重要时,程序员通常需要为数据构造函数选择特定的形状。假设我有

data Point = Point Int Int
data Segment = Segment Point Point

这很符合逻辑,但它有一堆额外的间接性:一个 Segment由七个堆对象组成。如果我正在处理很多分割市场,那就太糟糕了。

我可以用手压扁这个单位:
data Segment = Segment Int# Int# Int# Int#

但是现在我已经忘记了数字代表点的事实,并且我对段所做的一切都必须涉及相当不方便和奇怪的未装箱操作。

幸运的是,有一个更好的方法:
-- The small strict Int fields will be unpacked by default
-- with any reasonably recent GHC version.
data Point = Point !Int !Int

data Segment = Segment {-# UNPACK #-} !Point {-# UNPACK #-} !Point

这仍然给我每个段一个堆对象,但我可以使用 Point s 和 Int s 并且(通常)依赖于编译器很好地拆箱。

关于haskell - 为什么使用 UNPACK 和严格标记记录字段很常见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50460493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com