将字符串列表合并到这些字符串的元组列表中

时间:2017-04-04 04:42:25

标签: string list haskell merge tuples

我需要这样做:

mergers ["co","nt","ro","la"] ⇒ [("co","ntrola"),("cont","rola")("contro","la")]
mergers ["co","nt"] ⇒ [("co","nt")]
mergers ["co"] ⇒ []

但我不知道怎么做。我最近开始在Haskell编程,但我一直试图解决这个问题。

2 个答案:

答案 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的原因。