簡體   English   中英

GHC會優化a * a * a * a * a * a到(a * a * a)*(a * a * a)?

[英]Will GHC optimize a*a*a*a*a*a to (a*a*a)*(a*a*a)?

這與流行的問題有關, 為什么GCC不優化a * a * a * a * a * a到(a * a * a)*(a * a * a)?

對於像Haskell這樣的惰性函數式編程語言,編譯器將如何處理這種情況?

這不是strict和lazy之間的區別,而是浮點數的語義的乘積。

Haskell的Double與C的double或Java或大多數其他語言具有或多或少相同的語義。 非常聰明和合格的人已經遇到並決定用正確的十進制數表示的正確方法是二進制的,我們或多或少地堅持它。

所以答案是否定的,因為舍入與評估順序無關。

雖然在這里我們似乎在談論GHC用於添加浮點數的primop,但請記住, +在Haskell中是可擴展的,只是一個正常的函數。 Num類的新實例沒有義務提供關聯操作。

舉個簡單的例子,我有一個庫讓用戶在Haskell DSL中構建C AST。 為了方便添加內容,我在我的庫中添加了一個Num實例。 (a + b) + ca + (b + c)的AST不一樣! 他們以不同的方式“傾斜”。 如果GHC開始隨意移動我的parens我肯定會注意到並且生氣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM