如何在haskell中使表(Data.Map)严格?

Jog*_*usa 4 performance haskell compile-time data-structures strictness

为了学习Haskell(漂亮的语言),我正在从Spoj中解决问题.

我有一个包含19000个元素的表,在编译时都是已知的.如何使用'seq'严格控制表格?这是我的代码中的(强)简化示例.

import qualified Data.Map as M

-- table = M.fromList . zip "a..z" $ [1..]  --Upps, incorrect. sorry
table = M.fromList . zip ['a'..'z'] $ [1..]
Run Code Online (Sandbox Code Playgroud)

ham*_*mar 5

我认为你正在寻找deepseqControl.DeepSeq其中用于强制数据结构的全面评估.

它的类型签名是deepseq :: NFData a => a -> b -> b,它通过在返回第二个参数之前完全评估它的第一个参数来工作.

table = t `deepseq` t
  where t = M.fromList . zip ['a'..'z'] $ [1..]
Run Code Online (Sandbox Code Playgroud)

请注意,这里仍然存在一些懒惰.table在您尝试使用它之前不会得到评估,但此时将评估整个地图.

请注意,正如luqui指出的那样,Data.Map它的键已经是严格的,所以这样做只有在你希望它的值也是严格的时候才有意义.