我正在阅读 Data.Map 的源代码,我发现在data Map k a
的数据构造函数中使用了!()。
data Map k a = Tip
| Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a)
我发现!( )
不影响patten与数据匹配的方式。在mapWithKey的功能中,模式匹配仍然适用于5件事。所以我不认为它是一个运营商。
mapWithKey f (Bin sx kx x l r)
google后,我发现!( )
可能与用于延迟评估的-XBangPatterns
有关。我对吗 ?或者是出于其他目的?
答案 0 :(得分:20)
!
用于表示严格性。如果我们search for it on Hoogle,我们会看到指向keyword !的链接,该链接解释了该行为。报告defines确切的行为。
在data Foo = Foo ... !T ...
中,构造函数Foo
强制其参数,即Foo ... x ... = x `seq` RealFoo ... x ...
。其中RealFoo
是没有!
的构造函数。
{-# UNPACK #-}
是一个GHC扩展,表示Size
(即Int
)未加装箱存储,直接作为数据类型的一部分。
答案 1 :(得分:3)
在数据构造函数中!表示在构造类型时评估参数。这会强制评估函数并帮助您控制应用程序的空间要求。
high-performance Haskell幻灯片更详细地介绍了这一点。