Классический Haskell не обеспечивает обобщенного сопоставления с образцом.Он обеспечивает как стандартное сопоставление с образцом, так и охрану.Таким образом, вы можете писать такие вещи, как
foo :: [Int] -> ...
foo [1,2,3] = <some expression>
foo [1,2,x] = <some expression that can use x>
foo (x:xs) = <some expression where x is the first element, and xs is the rest>
foo (x:x':xs) = <some expression where x is the first element, x' the second, and xs is the rest>
bar :: (Int,String) -> ...
bar (1,"hello") =
bar (someInt,someString) =
bar (someInt,_) =
bar _ =
поочередно:
bar :: (Int, String) -> ...
bar x = case x of
(1,"hello") -> ...
_ -> ...
поочередно:
bar :: (Int, String) -> ...
bar (someInt,someString)
| someInt == 1 && someString == "hello" = ...
| someInt == 2 && someString == "hello" = ...
| otherwise = ...
GHC также предоставляет расширения для более удобной интеграции охранников и сопоставления с образцом.См. Разделы «Просмотр шаблонов» и «Стражи образцов»: http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html