该函数需要取一个整数元素的有序列表,并返回原始列表中相邻元素的所有组合。例如[1,2,3]会返回[[1,2,3],[1],[1,2],[2],[2,3],[3]]。
请注意,[1,3]不应包括在内,因为1和3在原始列表中不相邻。
小智 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)
| 归档时间: |
|
| 查看次数: |
1931 次 |
| 最近记录: |