我正在阅读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
)直接存储为未装箱,直接作为数据类型的一部分.