我想创建一个函数,该函数返回将列表拆分为两个非空部分的所有可能方法的列表.
split :: [([a], [a])]
Run Code Online (Sandbox Code Playgroud)
例如:
> split [1,2,3,4]
> [ ([1], [2,3,4]), ([1,2], [3,4]), ([1,2,3], [4]) ]
Run Code Online (Sandbox Code Playgroud)
我离解决方案很远.谁能帮我?
这是使用inits
和的另一种方法tails
:
设xs = [1,2,3,4].注意:
import Data.List
inits xs -- returns: [[] , [1], [1,2], [1,2,3], [1,2,3,4]]
tails xs -- returns: [[1,2,3,4], [2,3,4], [3,4], [4] , []]
Run Code Online (Sandbox Code Playgroud)
因此,将这两个列表压缩在一起可以为您提供将列表拆分为两部分的所有方法:
zip (inits xs) (tails xs)
= [ ([], [1,2,3,4]),
([1], [2,3,4] ),
([1,2], [3,4]) ,
([1,2,3,4], []) ]
Run Code Online (Sandbox Code Playgroud)
如果你不想要第一对和最后一对,只需适当修剪:
split xs = init $ tail $ zip (inits xs) (tails xs)
Run Code Online (Sandbox Code Playgroud)