gpt4 book ai didi

haskell - 在 Haskell 中将 WHNF 转换为 NF 感到困惑

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

这个问题在这里已经有了答案:





:sprint for polymorphic values?

(1 个回答)


3年前关闭。




在一个简单的例子中,通过打印将 WHNF 转换为 NF 效果很好

Prelude> let x = 1 + 2 :: Int
Prelude> :sprint x
x = _
Prelude> x
3
Prelude> :sprint x
x = 3

但在某种情况下,类型未声明它不起作用。
Prelude> let x = 1 + 2
Prelude> :sprint x
x = _
Prelude> x
3
Prelude> :sprint x
x = _

您能否详细解释一下为什么转换在最后一种情况下不起作用?

最佳答案

由于在 GHCi 中禁用了单态限制,最后一个 xx :: Num a => a 类型的多态值.所以它不是一个简单的整数,而是一种函数DictNum a -> a它可以创建任何数字类型的值。

确实,x :: Int, x :: Float, x :: Double将运行并产生不同的值。这些值在数值上相同,但在计算上不同,因为它们是不同类型的表示。

由于x本质上是“按需生成的多个值”,这里没有单一的 WHNF 或 NF。

请注意,如果我们计算 (x :: Int) + (x :: Int) ,然后 x正在重新计算两次:GHC 通常不会“缓存”类型为 Int 的 WHNF用于连续计算。这类似于 f 3 + f 3 , 其中 f 3未缓存(内存)。

这种重复计算正是单态限制试图避免的。

关于haskell - 在 Haskell 中将 WHNF 转换为 NF 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53517200/

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