[Haskell-cafe] how can this code be less?
Ketil Malde
ketil at malde.org
Fri Apr 25 02:51:00 EDT 2008
cetin tozkoparan <cetintozkoparan at yahoo.com> writes:
> sublist :: Eq a => [a] -> [a] -> Bool
> sublist [] _ = True
> sublist (_:_) [] = False
This can be simplified a bit, I think (Reformatted to one line):
> sublist (x:xs) (y:ys)
> | x == y = if isEqual (x:xs) (y:ys) == False then sublist (x:xs) ys else True
I don't like the "== False" for boolean expressions, so I'd write:
sublist (x:xs) (y:ys)
| x == y = if not (isEqual (x:xs) (y:ys)) then sublist (x:xs) ys else True
Or, swithing then and else clauses:
sublist (x:xs) (y:ys)
| x == y = if isEqual (x:xs) (y:ys) then True else sublist (x:xs) ys
If you look at the following clause:
> | otherwise = sublist (x:xs) ys
you'll notice that it is the same as the "else" clause. We can
therefore write:
sublist (x:xs) (y:ys)
| x == y && isEqual (x:xs) (y:ys) = True
| otherwise = sublist (x:xs) ys
isEqual will re-test x==y, so this is redundant:
sublist (x:xs) (y:ys)
| isEqual (x:xs) (y:ys) = True
| otherwise = sublist (x:xs) ys
The pattern guard is a bit gratuitious, why not write:
sublist (x:xs) (y:ys) = isEqual (x:xs) (y:ys) || sublist (x:xs) ys
Which is how you'd define the problem: a list xs is a sublist of ys if they
have equal prefixes, or if xs is a sublist of the tail of ys.
> isEqual :: Eq a => [a] -> [a] -> Bool
Slightly misleading name, since it checks a prefix, not complete equality.
> isEqual [] _ = True
> isEqual (_:_) [] = False
> isEqual (x:xs) (y:ys)
> | x==y = isEqual xs ys
> | otherwise = False
Similar to the above, you could write:
isEqual (x:xs) (y:ys) = x == y && isEqual xs ys
"lists (x:xs) and (y:ys) 'isEqual' if x == y and xs 'isEqual' ys"
As pointed out, you could (and should) write this using a couple of
Prelude functions. Oh, any errors in the code are left as excercises
for the reader (in other words, I didn't test this code at all, but
don't want to be perceived as lazy.)
-k
--
If I haven't seen further, it is by standing in the footprints of giants
More information about the Haskell-Cafe
mailing list