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

cod*_*e4j 11 haskell map

我正在阅读Data.Map的源代码,我发现!()用于数据构造函数中data Map k a.

data Map k a  = Tip 
              | Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a) 
Run Code Online (Sandbox Code Playgroud)

我发现这!( )不会影响patten如何匹配数据.在mapWithKey的功能中,模式匹配仍然适用于5件事.所以我不认为它是一个运营商.

mapWithKey f (Bin sx kx x l r) 
Run Code Online (Sandbox Code Playgroud)

谷歌后,我发现!( )可能与-XBangPatterns懒惰评估有关.我对吗 ?还是出于其他目的?

sha*_*haf 20

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

data Foo = Foo ... !T ...,构造函数Foo强制其参数,即Foo ... x ... = x `seq` RealFoo ... x ....RealFoo你没有得到的构造函数在哪里!.

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