2017-04-09 41 views
5

Rewrite rules可以幫助您優化程序。我想知道如果我在newtype中包裹我的物品,他們是否會工作。衆所周知,newtype不會帶來性能損失,它是一個編譯時包裝,它在運行時不見了。所以我想知道重寫規則是否仍然會以newtype觸發。例如,Data.TextWhat is fusion in Haskell?)有很多規則。用新類型重寫規則

GHC用戶指南發出警告算法的非機靈:

GHC目前使用非常簡單,句法,匹配算法所使用的表達式相匹配的規則LHS。它尋求一種替代方法,使得LHS和表達式在句法上等於模阿爾法轉換。如果需要,模式(規則),但不是表達式,是eta展開的。 (Eta--擴展表達式可能導致懶惰錯誤。)但不是beta轉換(稱爲高階匹配)。

現在我用Identity Text操作(因爲某些原因)。我仍然會獲得這些性能優勢嗎?我不是重寫規則的專家,可以自己執行基準測試,並確保其結果。

+2

不要忘記用戶定義的重寫規則並不是GHC唯一的優化。特別是內聯可以大大簡化代碼,並且通常會消除中間新類型。 (各種簡化過程通常會產生像'runIdentity.Identity'這樣的子表達式,它可以被輕易擦除。)這可能允許進一步的重寫規則觸發。 –

回答

6

重寫規則適用於GHC的中間語言Core(而不是Haskell)。那時候,newtype已經大部分消失了。例如,Identity x成爲x |> c其中c強制蒙上x :: TextIdentity Text類型的東西。

這些演員可以相互抵消,然後規則可以照常開火。所以如果一切都到位,你仍然應該能夠獲得文本重寫規則的好處。

不幸的是,沒有硬性保證,也沒有看中間代碼(並且知道要尋找什麼,例如,如果你知道某個地方融合應該發生),你不能確定使用Identity不在這裏付出代價。

+0

非常感謝!我希望看到一些基準,但這樣的解釋對我來說已經很好。 – Shersh