gpt4 book ai didi

haskell - 共享值在 Haskell 中被(不必要地)多次评估

转载 作者:行者123 更新时间:2023-12-01 09:35:27 26 4
gpt4 key购买 nike

我读过 this答案听起来像是在评估共享值时,它只评估一次,然后存储结果。例如:

x = 2 + 2
y = 2 + x
z = 3 + x

这里,x被计算一次,然后存储为4,就再也不会被计算了?至少这是我的假设。我的代码有一个值,每次被引用时都会重新计算。这是一个纯粹的值(value)。什么时候会发生这种情况,如何强制 Haskell 在计算后记住该值?

例子:

x = [1, 1, 2]
count = fst $ getCounts x

这里,count 每次被引用时都会被计算。

最佳答案

正如 Daniel Wagner 指出的那样,这里最可能的情况是 count 没有给出明确的类型签名,但是您已经关闭了单态限制(例如,使用 NoMonomorphismRestriction 语言扩展名)。这意味着 count 的类型类似于

count :: (Num a) => a

这意味着 GHC 将 count 视为一个函数(具体来说,从任何类型 aNum 类型类字典到 >a),因此结果不会共享,这意味着每次使用都会重新计算其值。

最好的解决方案是给 count 一个明确的类型签名,例如

count :: Int

您可能也应该对 x 做同样的事情(以及,就此而言,您的程序中的所有其他顶级定义)。

关于haskell - 共享值在 Haskell 中被(不必要地)多次评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8959170/

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