Pattern matching haskell

Viewed 188

I would be really glad, if someone could get me a hint how pattern matching should work in haskell. I have already spent hours with watching different tutorials but i don't get it.

I have the data type Assignment with the following instance:

data Assignment = EmptyA | Assign String Integer Assignment
  deriving Show
myAssn = Assign "x" 1 (Assign "x" 2 (Assign "y" 3 EmptyA))

Now i want to write a function that returns me the number to a given String. For example should lookupA myAssn "y" return 3:

lookupA :: Assignment -> String -> Integer
lookupA EmptyA _ = 0 
lookupA assn s = ???
1 Answers

As you probably know Assignment is a recursive data structure since it can hold instances of itself. To solve this problem, you need to take advantage of this feature of Assignment.

data Assignment = EmptyA | Assign String Integer Assignment
   deriving Show

lookupA :: Assignment -> String -> Integer
lookupA EmptyA _ = 0 
lookupA (Assign name number nAssign) lookingFor
  | name == lookingFor = number
  | otherwise          = lookupA nAssign lookingFor


myAssn = Assign "x" 1 (Assign "y" 2 (Assign "z" 3 EmptyA))

What this code does is as follows:

lookupA (Assign name number nAssign) lookingFor

It destructures the first argument and matches only on Assign data constructors. The using guards, it checks whether the name of this Assignment is equal to what we are looking for. If so, it returns the number, otherwise, it calls itself recursively on the assignment that is inside this assignment. Base case is of course the EmptyA data structure.

Related