11

我制作了非常耗时的算法,结果产生了一个短字符串。当我尝试打印它(通过 putStrLn)时,它一个字符一个字符地出现在屏幕上。我确实理解为什么会发生这种情况,并且我试图在实际打印之前强制评估字符串。

myPrint !str = putStrLn str

但这帮助很小。当我在调试中运行程序时,我注意到 !str 仅对第一个字符进行强制评估。

有谁知道这是为什么,以及如何处理?

4

2 回答 2

16

(!)转换为seq,它严格计算为弱头范式——也就是说,它只计算最外层的构造函数。要进行更深入的评估,您需要一个“深度”形式的seq.

这被称为deepseq.

它在deepseq 包中。

于 2011-04-05T20:27:38.087 回答
2
seqList :: [a] -> ()
seqList [] = ()
seqList (x:xs) = strictList xs
于 2011-04-06T07:07:17.020 回答