Reputation: 81
I'm a newbie regarding Haskell (and Java for that matter) and I tried to find a solution to my probably very simple problem. I need to create two arrays where it checks if the first array is a prefix of the second one, for example [5,6,7] [5,6,7,6,2] would give me the boolean true. This is what I tried, however I have no idea how to declare an array. n should be the highest slot number of array a and it counts down. As soon as one slot of a doesn't equal b it should return False. Is there another way to implement it without the n variable?
isaprefix :: [Int] -> [Int] -> Int -> Bool
isaprefix a b n = if n==0
then True
else
if a[n] == b [n]
then isaprefix ((a[n-1]) (b[n-1]))
else False
Upvotes: 2
Views: 807
Reputation: 9807
Yes, there is. You use pattern matching:
-- type signature can be slightly more general: any list of equatables.
isaprefix :: (Eq a) => [a] -> [a] -> Bool
-- first are the two "boring" cases.
-- we define that empty lists are prefixes of everything.
isaprefix [] _ = True
-- then: we also define that you can't be the prefix of an empty list.
isaprefix _ [] = False
-- those 2 are technically in conflict, so you need to know that the empty list is defined,
-- by the order of those definitions, to be a prefix of the empty list. This supports the
-- general property that `isprefixof x x == True` for all `x`.
-- ok, now here's the more interesting pattern: both lists are nonempty. We need them to
-- match on their first elements and also for the rest of the first list to prefix the
-- rest of the second list.
isaprefix (a:as) (b:bs)
| a == b = isaprefix as bs
| otherwise = False
Upvotes: 8