我有這個功能在Haskell:爲什麼非詳盡的衛兵造成無可辯駁的模式匹配失敗?
test :: (Eq a) => a -> a -> Maybe a
test a b
| a == b = Just a
test _ _ = Nothing
這是我當我試圖用不同的輸入功能:
ghci>test 3 4
Nothing
ghci>test 3 3
Just 3
根據真實世界哈斯克爾,第一模式是無可辯駁的。但似乎test 3 4
不會失敗的第一種模式,並匹配第二種。我預計會出現某種錯誤 - 也許是「非窮舉的守衛」。那麼這裏究竟發生了什麼,有沒有辦法在發生這種意外情況時啓用編譯器警告?
所以,如果它是一個無可辯駁的模式,它如何不匹配?匹配是否取決於守衛的成功?它是否匹配,然後在守衛失敗後不匹配? –
@Matt:模式確實匹配,並且任何由它綁定的變量都會被提供給後衛,然後可能會失敗。發生這種情況時,剩下的守衛將按順序嘗試。如果全部失敗,則嘗試下一個模式。如果沒有更多模式可供嘗試,則會發生非窮舉模式匹配錯誤。 – hammar
在GHC'否則'* *是特殊的。如果您嘗試自己定義它,最終會得到非詳盡的匹配編譯時警告(當然,只要您啓用這些警告即可)。 – Rotsor