【问题标题】:Expression Evaluation In Haskell: Fixing the type of a sub-expression causes parent expression to be evaluated to different degreesHaskell 中的表达式求值:固定子表达式的类型会导致父表达式的求值程度不同
【发布时间】:2015-09-03 05:27:02
【问题描述】:

我无法解释以下行为:

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 为其weak head normal form (WHNF)

我在阅读Simon Marlow's Parallel and Concurrent Programming In Haskell时无意中发现了这种行为。

【问题讨论】:

  • 另见sprint for polymorphic values,虽然我觉得令人费解的是y的元组构造函数即使在单态情况下也是可见的,所以它可能不是重复的。

标签: haskell lazy-evaluation weak-head-normal-form


【解决方案1】:

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

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 构造函数应用于指向 x thunk 的两个指针。应用构造函数不算作计算,所以它永远不会延迟延迟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-06
    • 2013-05-14
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多