我開始對在 haskell 中撰寫代碼有了一個不錯的處理,并且我注意到我已經犯了幾次錯誤模式:
doFoo :: ...
doFoo pattern1 = fooHelper ...
doFoo pattern2 = fooHelper ...
where
fooHelper = ...
fooHelper當然不在范圍內doFoo pattern1。我發現自己通過使用單個無可辯駁的模式來糾正錯誤,doFoo然后使用函式內部的 case 運算式對其進行模式匹配:
doFoo :: ...
doFoo irrefutable = case irrefutable of
pattern1 -> fooHelper ...
pattern2 -> fooHelper ...
where
fooHelper = ...
fooHelper現在當然在這兩種模式的范圍內。
據我所知,函式級別的模式匹配在任何方面都等同于 case 運算式中的模式匹配(盡管如果我錯了請糾正我),所以這似乎是一個合理的做法。這種模式會被認為是慣用的,還是有更好的(或只是常用的替代方法)?
uj5u.com熱心網友回復:
我認為在這種情況下將其轉換為 case 運算式是很常見的。除此之外,使用LambdaCaseextension,您可以將其縮短一點。
doFoo :: ...
doFoo = \case
pattern1 -> fooHelper ...
pattern2 -> fooHelper ...
where
fooHelper = ...
從 GHC 9.4.1 開始,您甚至可以對多個引數進行模式匹配。因此,例如,您可以撰寫如下內容:
doFoo :: ...
doFoo = \cases
pattern1 pattern1' -> fooHelper ...
pattern2 pattern2' -> fooHelper ...
where
fooHelper = ...
而不是寫
doFoo :: ...
doFoo x y = case (x, y) of
(pattern1, pattern1') -> fooHelper ...
(pattern2, pattern2') -> fooHelper ...
where
fooHelper = ...
請注意,它是\cases,不是\case
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517173.html
標籤:哈斯克尔
上一篇:如何檢查型別變數是不明確的型別?
