"where"关键字是懒惰的吗?

tol*_*ene 4 haskell lazy-evaluation

假设我有类似的功能

foo = 8 + f1
  where f1 = 8 + 9
        f2 = 8 + 10
Run Code Online (Sandbox Code Playgroud)

f1显然必须进行评估,但f2不一定要评估.会不会呢?我可以看到评估每个where表达式是一个性能问题.

ber*_*eal 6

是的,它很懒,所以f2不会被评估,例如:

foo = 8 + f1
    where f1 = 8 + 9
          f2 = last [1..]
Run Code Online (Sandbox Code Playgroud)

将立即计算,如果严格,将永远计算.

  • 这可能很有用:https://wiki.haskell.org/Let_vs._Where.但是,您可能需要做更广泛的阅读.此外,这里是'foldl'的来源:http://hackage.haskell.org/package/base-4.8.0.0/docs/src/Data-Foldable.html#foldl%27 (2认同)