我有以下函数,它接受一个列表并返回在给定元素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) 这样的东西,这样我就不会破坏递归?

最佳答案

您可以使用 take 和 drop 来完成:

splitlist :: [a] -> ([a],[a])
splitlist [] = ([],[])
splitlist l  = let half = (length(l) +1)`div` 2
               in (take half l, drop half l)

或者您可以利用函数 splitAt:
splitlist list = splitAt ((length (list) + 1) `div` 2) list

关于haskell - 简单的 Haskell 拆分列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13784671/

10-13 08:00