Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell列表理解-所有列表拆分的列表_List_Haskell - Fatal编程技术网

List Haskell列表理解-所有列表拆分的列表

List Haskell列表理解-所有列表拆分的列表,list,haskell,List,Haskell,我只想编写一个函数splits,它接受一个列表l,并返回一个元组列表,其中包含所有可能的拆分方法l 所以它应该是这样工作的: splits "Hello" [("","Hello"),("H","ello"),("He","llo"),("Hel","lo"),("Hell","o"),("Hello","")] 实施1我写的是: splits l = [(x,y) | i <- [0 ..length l], x <- take i l, y <- drop i l] 实

我只想编写一个函数
splits
,它接受一个列表
l
,并返回一个元组列表,其中包含所有可能的拆分方法
l

所以它应该是这样工作的:

splits "Hello"
[("","Hello"),("H","ello"),("He","llo"),("Hel","lo"),("Hell","o"),("Hello","")]
实施1我写的是:

splits l = [(x,y) | i <- [0 ..length l], x <- take i l, y <- drop i l]
实施2正确的解决方案是

splits l = [(take i l, drop i l) | i <- [0 ..length l]]

splits l=[(take i l,drop i l)| i关键观察点是语句的内容
x啊,现在我明白了。我忘了
take i l
是一个列表和
x
splits l = [(take i l, drop i l) | i <- [0 ..length l]]
[i | i <-[1..3]] => [1,2,3]
[c | c <- "Word"] => "Word" or equivalently ['W','o','r','d']
splits l = [(x,y) | i <- [0 ..length l], x <- [take i l], y <- [drop i l]]
splits :: [a] -> [([a],[a])]
splits xx = splits' [] ([],xx)
  where splits' :: [([a],[a])]-> ([a],[a]) -> [([a],[a])]
        splits' acc xs@(_,[]) = reverse (xs:acc)
        splits' acc (xs,y:ys) = let xs' = (xs++[y],ys)
                                in splits' (xs':acc) xs'
splits :: [a] -> [([a],[a])]
splits xx = zipWith splitAt [0..(length xx)] (repeat xx)