gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:43:13 25 4
gpt4 key购买 nike

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

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

最佳答案

除了在 Prelude 中找不到 initstails 之外,您可以这样定义您的函数:

yourFunction :: [a] -> [[a]]
yourFunction = filter (not . null) . concat . map inits . tails

这是它一步一步做的:

  • tails 给出删除了零个或多个起始元素的列表的所有版本:tails [1,2,3] == [[1,2,3],[2, 3],[3],[]]
  • map initsinits 应用于 tails 给定的每个列表,并且恰恰相反:它给出一个列表的所有版本都为零或删除更多结束元素:inits [1,2,3] == [[],[1],[1,2],[1,2,3]]
  • 我希望你已经知道 concat:它应用 (++) 你在列表中看到 (:) 的地方:连接 [[1,2],[3],[],[4]] == [1,2,3,4]。你需要这个,因为在 map inits 之后。 tails,你最终会得到一个列表列表的列表,而你想要一个列表列表。
  • filter (not .null) 从结果中移除空列表。会有多个(除非你使用空列表上的函数)。

您也可以使用 concatMap inits 而不是 concat 。 map inits,它做的事情完全一样。它通常也表现更好。


编辑:您可以使用 Prelude 定义它 - 只有这样的函数:

yourFunction = concatMap inits . tails
where inits = takeWhile (not . null) . iterate init
tails = takeWhile (not . null) . iterate tail

关于list - 我如何在 Haskell 中编写一个函数,它接受一个 Ints 列表并返回该列表的所有连续子列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8111527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com