Haskell 什么事!()表示在数据构造函数中?

Haskell 什么事!()表示在数据构造函数中?,haskell,map,Haskell,Map,我正在阅读Data.Map的源代码,我发现了!()用于数据映射ka的数据构造函数中 data Map k a = Tip | Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a) 我发现!()不影响模式与数据的匹配方式。在mapWithKey的功能中,模式匹配仍然是5件事。所以我不认为它是一个操作员。 mapWithKey f (Bin sx kx x l r) 谷歌搜索之后,我发现!()可能与用于延迟评估

我正在阅读Data.Map的源代码,我发现了!()用于
数据映射ka的数据构造函数中

data Map k a  = Tip 
              | Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a) 
我发现
!()
不影响模式与数据的匹配方式。在mapWithKey的功能中,模式匹配仍然是5件事。所以我不认为它是一个操作员。
mapWithKey f (Bin sx kx x l r) 

谷歌搜索之后,我发现
!()
可能与用于延迟评估的
-XBangPatterns
相关。我说得对吗?还是用于其他目的?

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


幻灯片将更详细地介绍这一点。

用于指示严格性。如果我们看到一个指向的链接,这可以解释这种行为。该报告描述了确切的行为

数据Foo=Foo!T…
,构造函数
Foo
强制其参数,即
Foo。。。x…=x`seq`RealFoo。。。x…
。其中,
RealFoo
是在没有
的情况下得到的构造函数


{-#UNPACK#-}
是一个GHC扩展,它意味着
大小(即
Int
)是以未装箱的方式存储的,直接作为数据类型的一部分。

BangPatterns
是一个做其他事情的扩展。这只是一个严格的字段。谢谢您的回答。哦,所以我完全错了?它不是用于惰性计算,而是用于计算参数的值。但我不知道为什么该方案会在地图上强制要求严格。在没有严格限制的情况下,我们仍然可以在浏览地图的树
数据时进行搜索、映射。地图
对效率要求严格。事实上,效率是人们通常关心增加严格的主要原因。谢谢你的解释:)