我注意到这种模式在Haskell库中很常见:
data Foo = Foo { field :: {-# UNPACK #-} !Sometype }
e.g。 UNPACK
一个字段的类型并使其严格。
我理解pragma和注释的效果是什么,但我不明白为什么它如此普遍:我已经在Haskell编程了15年并且很少使用严格注释,而且从不UNPACK
pragma。 / p>
如果这个成语如此有用,为什么不让它变得不那么“难看”?
答案 0 :(得分:7)
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
和Int
并且(通常)依赖编译器将所有内容拆箱。