首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell中的表达式计算:修复子表达式的类型会导致对父表达式进行不同程度的计算。

Haskell中的表达式计算:修复子表达式的类型会导致对父表达式进行不同程度的计算。
EN

Stack Overflow用户
提问于 2015-09-03 05:27:02
回答 1查看 134关注 0票数 8

我无法解释以下行为:

代码语言:javascript
复制
Prelude> let x = 1 + 2
Prelude> let y = (x,x)
Prelude> :sprint y
Prelude> y = _

现在,当我为x指定一个类型时:

代码语言:javascript
复制
Prelude> let x = 1 + 2 ::Int
Prelude> let y = (x,x)
Prelude> :sprint y
Prelude> y = (_,_)

为什么x's类型的规范强制y到它的弱头范式(WHNF)

我在阅读Simon在Haskell中的并行并行编程时偶然发现了这种行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-03 05:40:30

这是一个有根据的猜测。在第一个例子中,

代码语言:javascript
复制
x :: Num a => a

所以

代码语言:javascript
复制
y :: Num a => (a, a)

在GHC核心中,这个y是一个接受Num字典并给出一对的函数。如果要计算y,那么GHCi将为您默认它并应用Integer字典。但是,从您所展示的情况来看,sprint似乎不可能发生这种情况。因此,您还没有一对;您有一个函数产生一个。

当您专门处理Int时,字典将应用于x,因此您可以

代码语言:javascript
复制
x :: Int
y :: (Int, Int)

现在,x已不再是字典中的函数,而是一种重击。现在,不需要应用字典来计算yy只是一对构造函数的应用程序,用于指向x thunk的两个指针。应用构造函数不算作计算,因此不会延迟。

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

https://stackoverflow.com/questions/32367591

复制
相关文章

相似问题

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