codesnippets:patternmatching
This is an old revision of the document!
Table of Contents
Pattern matching, again
There was already some pattern matching explained, in the context of bindings here. Here we explain pattern matching in other contexts, which are:
- function definitions
- list comprehensions
- do notations
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
secondFromListwill 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")
You could leave a comment if you were logged in.
codesnippets/patternmatching.1664972507.txt.gz · Last modified: (external edit)
