haskell - GHC 会将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a) 吗?

标签 haskell optimization compilation

这与 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) + ca + (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/

相关文章:

Haskell 编译器在编译修改后的 Alonzo 程序时失败

haskell - 使用 cabal 分析可执行文件

java - 性能方面功能的优化实现

Java 优化范式

java - 当我创建一个新项目时 Eclipse 给我一个错误

haskell - 如何避免使用 snapframework 在 haskell 中的不同 'string' 类型之间进行转换?

haskell $!运算符和无限列表

javascript - 如何将一系列 javascript (jQuery) 按钮 "on clicks"转换为循环?

c++ - 调用 gcc _without_ -pthread 有什么好处?

c - 如何在 Matlab Coder 中为具有不同输入数量的函数定义输入类型?