簡體   English   中英

哪個在Haskell中效率更高; 模式匹配或嵌套if / case語句?

[英]Which is more efficient in Haskell; pattern matching or nested if/case statements?

我只是對Haskell中模式匹配的效率感到好奇。 什么是模式匹配比嵌套的if / case語句更好的簡單情況,然后是相反的?

謝謝你的幫助。

在Haskell中, case和模式匹配是密不可分的; 你不能沒有另一個。 if p then e1 else e2case p of { True -> e1; False -> e2 }語法糖case p of { True -> e1; False -> e2 } case p of { True -> e1; False -> e2 } 由於這些原因,我認為不可能制作出你要求的例子; 在Core Haskell中,一切都等同於case

在ML系列的語言中,優化器通常可以通過復雜的模式匹配來完成非常令人印象深刻的事情。 這對Haskell編譯器來說更難; 由於延遲評估,模式匹配編譯器不允許重新排序某些測試。 換句話說,如果以不同的方式嵌套case語句,則可能會獲得不同的性能,但在Haskell中,您也會得到不同的語義。 所以通常編譯器不會搞亂它。

至於編寫自己的代碼的方式,可以安全地假設具有最少案例表達式的代碼是最好的(記住一個if等同於一個case表達式)。

我沒有證實這一點,但我認為這兩種形式在編譯器轉換為核心Haskell時將成為嵌套的表達式。 找出答案的最好方法是詢問編譯器本身。 在GHC中,您可以使用以下參數打開核心中間程序的轉儲:

  • 在簡化之前:-ddump-ds
  • 簡化后:-ddump-simpl

根據規范,它們在語義上是等價的 當然,這並不一定意味着它們的實現方式相同,但如果一個體面的編譯器存在差異,我個人會感到驚訝。

暫無
暫無

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

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