Haskell 什么事!()表示在数据构造函数中?
我正在阅读Data.Map的源代码,我发现了!()用于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) 谷歌搜索之后,我发现!()可能与用于延迟评估
数据映射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
是一个做其他事情的扩展。这只是一个严格的字段。谢谢您的回答。哦,所以我完全错了?它不是用于惰性计算,而是用于计算参数的值。但我不知道为什么该方案会在地图上强制要求严格。在没有严格限制的情况下,我们仍然可以在浏览地图的树数据时进行搜索、映射。地图对效率要求严格。事实上,效率是人们通常关心增加严格的主要原因。谢谢你的解释:)