[Haskell-beginners] Longest common prefix of a list of lists
Daniel Fischer
daniel.is.fischer at googlemail.com
Fri Apr 29 16:32:39 CEST 2011
On Friday 29 April 2011 16:07:00, philipp siegmantel wrote:
> Hi,
>
> For one of my toy project I had to find the longest common prefix of a
> list of strings.
> I figured, that this function should only work on list-structure,
> meaning it should have type
>
> > longestCommonPrefix :: [[a]] -> [a]
>
> Sadly the best I could come up with was using explicit recursion. It
> works as far as I tested it, but I have the feeling that there's a
> better way to do it.
>
> Here is the code:
> > longestCommonPrefix :: Eq a => [[a]] -> [a]
> > longestCommonPrefix [] = []
> > longestCommonPrefix xss | any null xss = []
> >
> > | otherwise = loop xss []
> >
> > where loop ::Eq b => [[b]] -> [b] -> [b]
> >
> > loop xss acc =
> >
> > let xs = concatMap (take 1) xss
> > in if any (\x -> x /= head xs) (tail xs)
> >
> > then reverse acc
> > else loop (map tail xss) (head xs : acc)
A different point of view:
given at least two lists, lists@(list1:more@(list2:_)), the longest common
prefix of lists is the common prefix of list1 and the longest common prefix
of more, so
longestCommonPrefix :: Eq a => [[a]] -> [a]
longestCommonPrefix [] = [] -- what else?
longestCommonPrefix lists = foldr1 commonPrefix lists
-- to get the common prefix of two lists, we use explicit recursion, I
don't see an elegant way to avoid that.
commonPrefix :: Eq a => [a] -> [a] -> [a]
commonPrefix (x:xs) (y:ys)
| x == y = x : commonPrefix xs ys
commonPrefix _ _ = []
produces the result incrementally.
More information about the Beginners
mailing list