【发布时间】:2012-09-12 20:01:00
【问题描述】:
我有这个代码:
divisors n = 1:[y|y<-[2..(n `div` 2)], n `mod` y == 0]
writeList l = do print "Start"
print l
然后,我想用严格的参数调用函数;我试过了:
writeList $! (divisors 12345678)
和
(divisors 12345678) \`seq\` (writeList (divisors 12345678))
但它的行为不像有严格的论据:即在“开始”之后我必须等待(divisors 12345678)的评估
我错过了什么?
【问题讨论】:
-
你忽略了 whnf 和 nf 之间的区别。
-
另外,像这样使用
seq(或deepseq)只会丢弃评估第一个参数的结果。您需要引入显式共享,例如let ds = divisors 12345678 in ds `seq` writeList ds. -
@hamar:感谢您的帮助。
writeList $!! (divisors 12345678)正确吗?
标签: haskell strictness