8

我无法解释以下行为:

Prelude> let x = 1 + 2
Prelude> let y = (x,x)
Prelude> :sprint y
Prelude> y = _

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

Prelude> let x = 1 + 2 ::Int
Prelude> let y = (x,x)
Prelude> :sprint y
Prelude> y = (_,_)

为什么 x 类型的规范强制 y 为其弱头范式(WHNF)

我在阅读Simon Marlow 的 Parallel and Concurrent Programming In Haskell时意外发现了这种行为。

4

1 回答 1

10

这是一个明智的猜测。在你的第一个例子中,

x :: Num a => a

所以

y :: Num a => (a, a)

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

当你专攻时Int,字典被应用到x,所以你得到

x :: Int
y :: (Int, Int)

而不是字典中的函数,x现在是一个 thunk。现在不需要使用字典来评估yy只是将 pair 构造函数应用于指向xthunk 的两个指针。应用构造函数不算作计算,所以它永远不会延迟延迟。

于 2015-09-03T05:40:30.237 回答