如何定义一个段函数

How to make define a segments function

如何定义一个函数段,它以有限列表 xs 作为参数,returns xs 的所有段的列表。 (xs 的一段是xs 的相邻元素的选择。)

例如,段 [1, 2, 3] = [[1, 2, 3], [1, 2], [2, 3], [1], [2], [3]] .

我知道如何写一个init,但是我该如何扩展到这种情况!

segments :: [a] -> [[a]]
segments [] = []
segments (x:xs) = [x:xs] ++ segments (init (x:xs))

如果你可以编写自己的 inits_ 函数(我特地在末尾添加 _ 因为 inits 是标准函数,但行为有点不同),你可以编写函数 segments 通过为所有尾巴调用 inits_ (我只是重写了 segments 的代码并将其重命名为 inits_):

inits_ :: [a] -> [[a]]
inits_ [] = []
inits_ xs = xs : inits_ (init xs)

segments :: [a] -> [[a]]
segments [] = []
segments (x:xs) = inits_ (x:xs) ++ segments xs