Haskell的求值如何处理带约束的表达式

问题描述 投票:3回答:1

假设我用GHCi编写:let x = 1 + 2 :: Integerseq x ()

输入后:sprint x

GHCi自然会打印x = 3

但是,let x = 1 + 2seq x ()

之后:sprint x

产量x = _

两个表达式之间的唯一区别是它们的类型(IntegerNum a => a)。我的问题是究竟发生了什么,为什么在后面的示例中似乎没有评估x

haskell polymorphism evaluation strictness
1个回答
1
投票

主要问题是

let x = 1 + 2

定义类型为forall a. Num a => apolymorphic值,这与函数的计算结果相似。

x的每次使用可以使用不同的类型,例如x :: Intx :: Integerx :: Double等。这些结果不会以任何方式“缓存”,而是每次都重新计算,就好像x是被多次调用的函数一样。

© www.soinside.com 2019 - 2024. All rights reserved.