【发布时间】:2013-09-30 05:36:28
【问题描述】:
在 Scala 中,我可以表达一个函数,每次引用它时都会对其进行评估:
def function = 1 + 2 + 3
或一个只评估一次的val
val val1 = 1 + 2 + 3
即使我多次调用它。
在 Haskell 中,我当然可以定义一个函数(同样,每当我调用它时,它都会一遍又一遍地求值):
function = 1 + 2 + 3
我可以在 Haskell 中定义类似 Scala 的 val 吗?
更新:问题不在于惰性评估。
更新 2:
function 的值将被计算多少次?
function = 1 + 2 + 3
main = do
print function
print function
print function
【问题讨论】:
-
谁说函数在haskell中一次又一次地被评估??
-
这不是“一遍又一遍”评估的
-
这个问题是基于对 Haskell 行为的一些误解。
-
更新 2 的答案是:“至少一次。”您似乎对 Haskell 的一个特别不寻常的怪癖感到困惑:根据设计,没有办法告诉某事被评估了多少次,并且尝试考虑 Haskell 代码并不是特别有成效方式。在像 Scala 这样的语言中,了解与
function关联的表达式被评估了多少次可能很重要,例如因为它打印了一些东西;在 Haskell 中,无法判断,所以假设编译器会尝试以最有效的方式评估它并考虑其他事情。 -
@jacobm 我认为区分 Haskell 规范和典型实现是有意义的。正如您所说,Haskell 规范几乎什么也没说,这意味着“至少一次”是您能说的最好的。但是如果你开始谈论一个特定的实现——例如GHC——那么你可以多说一点,在这种情况下,你也可以说“最多一次”。