如何在 Haskell 中编写一个函数,该函数接受一个 Int 列表并返回该列表的所有连续子列表?

use*_*145 2 haskell list

该函数需要取一个整数元素的有序列表,并返回原始列表中相邻元素的所有组合。例如[1,2,3]会返回[[1,2,3],[1],[1,2],[2],[2,3],[3]]

请注意,[1,3]不应包括在内,因为13在原始列表中不相邻。

小智 5

除了在中找不到inits和的事实之外,您还可以这样定义您的函数:tailsPrelude

yourFunction :: [a] -> [[a]]
yourFunction = filter (not . null) . concat . map inits . tails
Run Code Online (Sandbox Code Playgroud)

这是它的作用,一步一步:

  • tails 给出删除零个或多个起始元素的列表的所有版本: tails [1,2,3] == [[1,2,3],[2,3],[3],[]]
  • map inits适用inits于由 给出的每个列表tails,并完全相反:它给出了一个列表的所有版本,其中删除了零个或多个结尾元素:inits [1,2,3] == [[],[1],[1,2],[1,2,3]]
  • 我希望你已经知道concat:它适用于(++)(:)在列表中看到的地方:concat [[1,2],[3],[],[4]] == [1,2,3,4]。您需要这个,因为在 之后map inits . tails,您最终会得到一个列表列表,而您想要一个列表列表。
  • filter (not . null)从结果中删除空列表。将不止一个(除非您使用空列表中的函数)。

您也可以使用concatMap inits代替concat . map inits,它的作用完全相同。它通常也表现得更好。


编辑:您可以使用Prelude-only 函数定义它:

yourFunction = concatMap inits . tails
    where inits = takeWhile (not . null) . iterate init
          tails = takeWhile (not . null) . iterate tail
Run Code Online (Sandbox Code Playgroud)

  • `concatMap (tail .inits) 。如果您想避免使用“过滤器”,则使用“尾巴”。 (3认同)