mam tej funkcji w Haskell:Dlaczego niewyczerpujące osłony powodują niepowodzenie dopasowania wzorca?
test :: (Eq a) => a -> a -> Maybe a
test a b
| a == b = Just a
test _ _ = Nothing
To co mam, kiedy próbowałem funkcji z różnych wejść:
ghci>test 3 4
Nothing
ghci>test 3 3
Just 3
Według Real World Haskell, pierwszy wzór jest niepodważalne. Ale wygląda na to, że test 3 4
nie zawodzi pierwszego wzorca i dopasowuje go do drugiego. Spodziewałem się pewnego rodzaju błędu - być może "niewyczerpujących strażników". Co więc tak naprawdę się tutaj dzieje i czy istnieje sposób, aby włączyć ostrzeżenia kompilatora, na wypadek gdyby tak się stało?
Więc jeśli jest to niezaprzeczalny wzór, w jaki sposób nie pasuje? Czy dopasowanie zależy od sukcesu strażników? Czy najpierw pasuje, a następnie unmatch po tym, jak strażnik zawodzi? –
@Matt: Wzorzec rzeczywiście pasuje, a wszelkie powiązane z nim zmienne są następnie udostępniane strażnikowi, który może następnie zawieść. Kiedy tak się stanie, pozostali strażnicy zostaną wypróbowani w kolejności. Jeśli wszystkie zawiodą, zostanie wypróbowany następny wzór. Jeśli nie ma już żadnych wzorów do wypróbowania, pojawia się niewyczerpujący błąd dopasowania wzoru. – hammar
W GHC "other" * is * special. Jeśli spróbujesz samemu go zdefiniować, otrzymasz niepełne ostrzeżenia dotyczące czasu kompilacji (pod warunkiem, że aktywujesz te ostrzeżenia, oczywiście). – Rotsor