【问题标题】:Missing something with strictness遗漏一些严格的东西
【发布时间】: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


【解决方案1】:

seq(或$!) 仅对第一个头范式进行评估,在您的情况下为(:) 构造函数,您可以使用deepseq(或$!!) 评估为范式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 2021-04-25
    • 2011-05-14
    • 2019-05-17
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多