对haskell中的列表强制严格

Max*_*xym 11 evaluation haskell lazy-evaluation data-structures strictness

我做了非常耗时的算法,结果产生了一个短字符串.当我尝试打印它(通过putStrLn)时,它会逐个字符显示在屏幕上.我确实理解为什么会这样,我试图在实际打印之前强制评估字符串.

myPrint !str = putStrLn str
Run Code Online (Sandbox Code Playgroud)

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

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

Don*_*art 16

(!)转换为seq,严格评估为弱头范式 - 也就是说,它只评估最外层的构造函数.为了更深入地评估,你需要一种"深层"的形式seq.

这被称为deepseq.

它是在deepseq包中.

  • 为了澄清,对于列表,"最外面的构造函数"是最左边的`:`,这解释了为什么它只强制字符串的第一个字符. (2认同)