import Data.List (inits, tails)
mergers :: [[a]] -> [([a], [a])]
mergers xs = init $ tail $ zip (map concat $ inits xs) (map concat $ tails xs)
inits xs返回xs的所有前缀(包括[]和原始列表),tails xs返回xs的所有后缀(包括[]和原始列表)。由于包含了原始列表和[],所以后面我们必须使用init和tail。
以下是一些中间结果:
ghci> inits ["co","nt","ro","la"]
[[],["co"],["co","nt"],["co","nt","ro"],["co","nt","ro","la"]]
ghci> tails ["co","nt","ro","la"]
[["co","nt","ro","la"],["nt","ro","la"],["ro","la"],["la"],[]]
ghci> map concat $ inits ["co","nt","ro","la"]
["","co","cont","contro","controla"]
ghci> map concat $ tails ["co","nt","ro","la"]
["controla","ntrola","rola","la",""]
ghci> let xs = ["co","nt","ro","la"] in zip (map concat $ inits xs) (map concat $ tails xs)
[("","controla"),("co","ntrola"),("cont","rola"),("contro","la"),("controla","")]
最后一行说明为什么zip 之后的init . tail 是必要的。