我需要这样做:
mergers ["co","nt","ro","la"] ⇒ [("co","ntrola"),("cont","rola")("contro","la")]
mergers ["co","nt"] ⇒ [("co","nt")]
mergers ["co"] ⇒ []
但我不知道怎么做。我最近开始在Haskell编程,但我一直试图解决这个问题。
答案 0 :(得分:1)
你可以试试这个,作为第一个解决方案:
a=["12","34","56", "78"]
g n x= (concat $ fst y, concat $ snd y) where y=splitAt n x
h a = [g i a|i<-[1..(length a)-1]]
答案 1 :(得分:1)
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
的所有后缀(包括{{1}和原始列表)。由于原始列表和[]
已包含在内,我们之后必须使用[]
和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","")]
之后需要init . tail
的原因。