我无法解释以下行为:
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's类型的规范强制y到它的弱头范式(WHNF)
我在阅读Simon在Haskell中的并行并行编程时偶然发现了这种行为。
发布于 2015-09-03 05:40:30
这是一个有根据的猜测。在第一个例子中,
x :: Num a => a所以
y :: Num a => (a, a)在GHC核心中,这个y是一个接受Num字典并给出一对的函数。如果要计算y,那么GHCi将为您默认它并应用Integer字典。但是,从您所展示的情况来看,sprint似乎不可能发生这种情况。因此,您还没有一对;您有一个函数产生一个。
当您专门处理Int时,字典将应用于x,因此您可以
x :: Int
y :: (Int, Int)现在,x已不再是字典中的函数,而是一种重击。现在,不需要应用字典来计算y!y只是一对构造函数的应用程序,用于指向x thunk的两个指针。应用构造函数不算作计算,因此不会延迟。
https://stackoverflow.com/questions/32367591
复制相似问题