什么!()在数据构造函数中意味着什么?

时间:2013-06-27 07:09:44

标签: haskell map

我正在阅读 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有关。我对吗 ?或者是出于其他目的?

2 个答案:

答案 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幻灯片更详细地介绍了这一点。