这与 Why doesn't GCC optimize a*a*a*a*a*a to (a*a*a)*(a*a*a)? 的热门问题有关。
对于 Haskell 这样的惰性函数式编程语言,编译器会如何处理这种情况?
最佳答案
这不是严格和懒惰的区别,而是 float 语义的产物。
Haskell 的 Double
与 C 的 double
或 Java 或大多数其他语言具有或多或少相同的语义。非常聪明和有资格的人已经会面并决定了用二进制表示有理十进制数的正确方法,我们或多或少地坚持下去。
所以答案是否定的,因为舍入与评估顺序无关。
虽然这里我们似乎在谈论 GHC 用于添加 float 的 primop,但请记住,+
在 Haskell 中是可扩展的,并且只是一个普通函数。 Num
类型类的新实例没有义务提供关联操作。
作为一个简单的例子,我有一个库,可以让用户在 Haskell DSL 中构建 C AST。为了方便添加内容,我在我的库中添加了一个 Num
实例。 (a + b) + c
和 a + (b + c)
的 AST 不一样!他们以不同的方式“倾斜”。如果 GHC 开始在我的 parent 身上随意移动,我肯定会注意到并感到恼火。
关于haskell - GHC 会将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22689135/