为了学习 Haskell(漂亮的语言),我正在从 Spoj开始讨论问题. 我有一个包含19000个元素的表,在编译时都是已知的. 如何使用’seq’严格控制表格? 这是我的代码中的(强)简化示例. import qual
我有一个包含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..]我想你正在寻找Control.DeepSeq中的deepseq,它用于强制完整评估数据结构.
它的类型签名是deepseq :: NFData a => a – > b – > b,它的工作原理是在返回第二个参数之前完全评估它的第一个参数.
table = t `deepseq` t where t = M.fromList . zip ['a'..'z'] $[1..]
请注意,这里仍然存在一些懒惰.在您尝试使用表之前,不会对表进行评估,但在此时将评估整个映射.
请注意,正如luqui指出的那样,Data.Map的键已经很严格了,所以这样做只有在你想让它的值严格时才有意义.