LCS (最長共通文字列)

http://www.agusa.i.is.nagoya-u.ac.jp/person/mzp/hiki/?exercise#l16 から。
ひねりも何もない、普通の関数。テストもろくにしてないのでもしかしたらダメかも。

lcs :: Eq a => [a] -> [a] -> [a]
lcs [] _ = []
lcs _ [] = []
lcs (x:xs) ys = longer (x : (lcs xs $ dropWhile' (/=x) ys)) (lcs xs ys)
longer     l1 l2 = if length l1 < length l2 then l2 else l1
dropWhile' p  l  = if null ll then [] else tail ll
    where ll = dropWhile p l
Main> lcs "assault" "salty"
"salt"
Main>