gpt4 book ai didi

haskell - `evaluate` 、 `rwhnf` 和 `seq` 及其对应的 "deep"有什么区别?

转载 作者:行者123 更新时间:2023-12-04 20:26:28 25 4
gpt4 key购买 nike

the wiki page about timing computations ,有一个纯计算计时的例子。核心思想是使用函数evaluate , rnfseq确保在对 1 + y 的两次调用之间执行所需的计算(在下面的示例中为 getCPUTime) :

time :: (Num t, NFData t) => t -> IO ()
time y = do
start <- getCPUTime
replicateM_ lim $ do
x <- evaluate $ 1 + y
rnf x `seq` return ()
end <- getCPUTime

我想澄清一下函数的使用 evaluate , rnfseq这里。

一、 evaluate将其参数评估为弱头范式,但似乎其另一个目的是处理评估期间可能发生的异常。我不确定没有它会发生什么,但我已经准备好假设异常处理需要它。

然后, rnf由于调用 evaluate,将值评估为范式,以确保整个计算发生在这里,并且没有未评估的位保持弱头范式。 .正如 here 所讨论的,这可能是也可能不是人们想要的。 ,因为可能不需要额外的评估。

最后, seq确保表达式 rnf x在返回 return () 之前被评估为弱头正常形式.

总结一下: evaluate处理潜在的异常, rnf评估 x深入确保整个计算是定时的, seq确保 rnf x被及时评估。

以下是我的问题:
  • 不是打给seq吗?对 rnf 的调用是多余的哪个已经将值评估为正常形式?
  • 如果我更愿意将评估时间安排为弱头范式而不是范式,我可以简单地替换rnf吗?与 rwhnf ?那么这 3 个电话会是 evaluate , rwhnfseq是多余的,这样我就可以消除对最后 2 个的使用,并且只对 evaluate 感到满意?
  • 最佳答案

  • 调用 seq不是多余的,因为 rnf x需要评估(到 WHNF)以评估 x到 NF,那是 seq的工作。
  • 是的,我相信:只是
    evaluate $ 1 + y
    return ()

  • 但!如果有意 evaluate这是处理异常我认为它不起作用,因为它们可以从 rnf x 抛出也一样。如果不是,我看不到好处
    rnf (1 + y) `seq` return ()

    两者都是 force evaluate文档提出了一个更简单的替代方案:
    evaluate $ force $ 1 + y
    return ()

    也许那页是在 force 之前写的可用吗?即便如此,除非我错过了什么,
    evaluate $ rnf $ 1 + y

    会正确地完成这项工作。

    关于haskell - `evaluate` 、 `rwhnf` 和 `seq` 及其对应的 "deep"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59822281/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com