我有下面的函数,它接受一个列表,并返回在给定元素n处拆分的两个子列表。然而,我只需要将其拆分为两半,奇数长度的列表具有更大的第一个子列表
splitlist :: [a] -> Int -> ([a],[a])
splitlist [] = ([],[])
splitlist l@(x : xs) n | n > 0 = (x : ys, zs)
| otherwise = (l, [])
where (ys,zs) = splitlist xs (n - 1)
我知道我需要把签名改为[a] -〉([a],[a]),但是我应该把length(xs)之类的东西放在代码的什么地方,这样我就不会破坏递归了。
3条答案
按热度按时间u91tlkcl1#
在真实的程序中,您可能应该使用
(i.e.沿着于dreamcrash的答案。)
但是,如果出于学习的目的,您正在寻找一个显式递归解决方案,请研究以下内容:
n3h0vuf22#
您可以使用take和drop来执行此操作:
或者您可以利用函数splitAt:
pieyvz9o3#
你可以通过使用take和drop内置函数来实现这一点。但是如果你想用所有自己编写的函数来实现这一点,可以试试这个: