====== Pattern matching, again ======
There was already some pattern matching explained, in the context of bindings [[codesnippets:bindingandpatternmatching|here]]. Here we explain pattern matching in other contexts, which are:
* function definitions
* list comprehensions
* do notations
* case constructs
Before we start with that, we provide more details about pattern matching, regarding:
* lists
* algebraic data types
* tuples
Additionally, even before that we explain the wildcard ''_''.
===== Wildcard =====
* wildcard ''_''
* stands-in for any value
* example
* code:
main :: IO ()
main =
do
print (firstFromTuple3 ("A",'b','c'))
print (secondFromList "Hallo!")
print (getZipFromPerson (PersonNameZipAndEMail "Haskell" "Brooks" "Curry" 16802 "hbc@psu.edu"))
firstFromTuple3 :: (a,b,c) -> a
firstFromTuple3 (x,_,_) = x
secondFromList :: [a] -> a
secondFromList (_:x:_) = x
data Person = PersonNameAndZip String String String Int | PersonNameZipAndEMail String String String Int String
getZipFromPerson :: Person -> Int
getZipFromPerson (PersonNameAndZip _ _ _ nZip) = nZip
getZipFromPerson (PersonNameZipAndEMail _ _ _ nZip _) = nZip
* compiles, with warning: Pattern match(es) are non-exhaustive
* executes, with output:
"A"
'a'
16802
* NOTE: The function ''secondFromList'' will execute with runtine error when there is less than two elements in the list.
* example
* code:
main :: IO ()
main =
do
print (secondFromList "H")
secondFromList :: [a] -> a
secondFromList (_:x:_) = x
* compiles, with warning: Pattern match(es) are non-exhaustive
* executes, with output:
Test3-exe.exe: app\Main.hs:7:1-26: Non-exhaustive patterns in function secondFromList
===== Context: function definition =====
* binding actual parameters ("caller perspective") to parameters ("inner function perspective")
* select the structure of data, to pick cases
* binds parameter names, to define the function itself
* example:
* code:
import Prelude hiding (length)
main :: IO ()
main =
do
print (length s) -- "caller perspective" for first parameter of function length
s :: String
s = ('H':'e':['l', 'l', 'o']) ++ (' ':"World!")
length :: [a] -> Integer
length [] = 0 -- "inner function perspective" - selected when list is empty
length (_:lrx) = 1 + (length lrx) -- "inner function perspective" - selected when at least one element
-- using the rest (lrx) for recursive call of length (again "caller perspective")
===== ✎ =====
~~DISCUSSION~~