Rewrite rules可以幫助您優化程序。我想知道如果我在newtype
中包裹我的物品,他們是否會工作。衆所周知,newtype
不會帶來性能損失,它是一個編譯時包裝,它在運行時不見了。所以我想知道重寫規則是否仍然會以newtype
觸發。例如,Data.Text
(What is fusion in Haskell?)有很多規則。用新類型重寫規則
GHC用戶指南發出警告算法的非機靈:
GHC目前使用非常簡單,句法,匹配算法所使用的表達式相匹配的規則LHS。它尋求一種替代方法,使得LHS和表達式在句法上等於模阿爾法轉換。如果需要,模式(規則),但不是表達式,是eta展開的。 (Eta--擴展表達式可能導致懶惰錯誤。)但不是beta轉換(稱爲高階匹配)。
現在我用Identity Text
操作(因爲某些原因)。我仍然會獲得這些性能優勢嗎?我不是重寫規則的專家,可以自己執行基準測試,並確保其結果。
不要忘記用戶定義的重寫規則並不是GHC唯一的優化。特別是內聯可以大大簡化代碼,並且通常會消除中間新類型。 (各種簡化過程通常會產生像'runIdentity.Identity'這樣的子表達式,它可以被輕易擦除。)這可能允許進一步的重寫規則觸發。 –