haskell 定义一个函数,将列表的所有非平凡拆分作为对列表返回

cetgtptt  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(126)

我是Haskell的新手,有一个工作表问题把我难倒了,这个问题要求我定义一个函数,它接受一个列表,并返回一个元组列表,每个元组都包含原始列表的一个子列表。

我已经尝试了下面的方法。但是,正如预期的那样,在每次递归时,前一个头都会被丢弃。

splits :: [Int] -> [([Int],[Int])]
splits []
  = [([],[])]
splits (l:ls)
  = ([] ++ [l], ls) : splits ls

这是我得到的结果。

[([1],[2,3,4]),([2],[3,4]),([3],[4]),([4],[]),([],[])]

任何关于如何做到这一点的建议都将不胜感激!

kgsdhlau

kgsdhlau1#

您只需要在递归调用结果的前几项前面加上l,因此

splits :: [a] -> [([a], [a])]
splits [] = []
splits (l:ls) = ([l], ls) : map f (splits ls)
    where f (x, y) = (l:x, y)

或者用first

import Control.Arrow(first)

splits :: [a] -> [([a], [a])]
splits [] = []
splits (l:ls) = ([l], ls) : map (first (l:)) (splits ls)
gcuhipw9

gcuhipw92#

这也会移除具有空尾部的项目:

splits :: [Int] -> [([Int], [Int])]
splits [] = []
splits [x] = []
splits (x : xs) = ([x], xs) : map f (splits xs)
  where
    f (z, y) = (x : z, y)

相关问题