11

我正在阅读Data.Map的源代码,我发现 !() 用于data Map k a.

data Map k a  = Tip 
              | Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a) 

我发现这!( )不会影响模式与数据的匹配方式。在mapWithKey的功能中,patten匹配还是针对5件事。所以我不认为它是一个运营商。

mapWithKey f (Bin sx kx x l r) 

google 后,我发现!( )可能与-XBangPatterns用于惰性评估的哪个有关。我对吗 ?还是出于其他目的?

4

2 回答 2

20

!在数据类型声明中用于表示严格性。如果我们在 Hoogle 上搜索它,我们会看到一个关键字链接!,它解释了这种行为。报告定义了确切的行为。

data Foo = Foo ... !T ...中,构造函数Foo强制其参数,即Foo ... x ... = x `seq` RealFoo ... x ...。如果RealFoo没有!.

{-# UNPACK #-}是一个 GHC 扩展,这意味着Size(ie Int) 未装箱存储,直接作为数据类型的一部分。

于 2013-06-27T07:19:15.977 回答
3

在数据构造函数中!表示在构造类型时对参数进行评估。这会强制评估函数并帮助您控制应用程序的空间需求。

高性能 Haskell幻灯片更详细地介绍了这一点。

于 2013-06-27T07:17:39.183 回答