詳盡的情況下,我有一個case
表達了比較多的模式:與一元后衛
case x of
... -> ...
... -> ...
... -> ...
... -> ...
...
_ -> ...
其中一個案件有一個後衛:
case x of
... -> ...
... -> ...
... | condition -> ...
-- If condition is false, fall through to 「Rest」.
-- Rest:
... -> ...
... -> ...
...
_ -> ...
如果保護不匹配,我們只是通過其餘的案例,沒有問題。但現在我需要單點測試,所以我這樣做:
case x of
... -> ...
... -> ...
... -> do
condition <- action
if condition
then ...
else ... -- How to fall through?
-- Rest:
... -> ...
... -> ...
...
_ -> ...
但是,我認爲我犯了一個失誤。似乎沒有辦法讓else
分支繼續處理其餘的情況,而不復制這些分支或將它們分解爲函數。無論哪種方式,都要進行詳盡的檢查:如果我想在警衛之後添加一個案例,編譯器不知道這些匹配是否詳盡無遺。
如何更改此函數或parameterise/wrap數據類型以使用monadic guard來詳盡檢查?
我想你已經迷茫了自己。如果「Bar」匹配,則只會輸入警衛(或「if-then-else」)。如果「Bar」匹配(並且達到了條件),那麼您已經知道'Baz','Quux'等不匹配,因此沒有理由繼續使用'case'塊。 –
@BenjaminHodgson:很好。更新了示例。我使用一對值進行操作,並且對於後面的情況仍然可以匹配。 –
不,不是。你能提供你正在使用的**實際案例,而不是一個名稱,而實際上並沒有顯示你在做什麼? – Bakuriu