首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell中WHNF向NF转换的困惑

Haskell中WHNF向NF转换的困惑
EN

Stack Overflow用户
提问于 2018-11-28 10:24:07
回答 1查看 121关注 0票数 7

在一个简单的例子中,通过打印精细地将WHNF转换为NF

代码语言:javascript
复制
Prelude> let x = 1 + 2 :: Int
Prelude> :sprint x
x = _
Prelude> x
3
Prelude> :sprint x
x = 3

但在一种情况下,类型没有声明它不工作。

代码语言:javascript
复制
Prelude> let x = 1 + 2
Prelude> :sprint x
x = _
Prelude> x
3
Prelude> :sprint x
x = _

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-28 10:34:33

由于在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没有缓存(回忆录)。

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53517200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档