Haskell 反转尾部但留下第一个元素

Haskell reversing tail but leaving first element

我在进行以下练习时遇到了问题:

我应该反转列表中除第一个元素之外的所有元素,列表的第一个元素必须保留在其原始位置。

正确示例:

input: rvrsTail [1,2,3,4,5]
output [1,5,4,3,2]

到目前为止我做了什么:

rvrsTail :: [x] -> [x]
rvrsTail xs = reverse ( tail xs)

这确实颠倒了列表的尾部,但删除了第一个元素,并且由于我无法将第一个元素存储在变量中,所以我似乎无法理解如何解决这个问题。

错误输出:

input: rvrsTail [1,2,3,4,5]
output [5,4,3,2]

由于这应该是初学者的练习,因此解决方案应该很简单。

你快到了。为了确保列表的第一个元素保持原样,只需使用模式匹配并删除 tail 调用:

rvrsTail :: [x] -> [x]
rvrsTail (x:xs) = x:(reverse xs)

现在,请注意上面的函数在尝试使用空列表时会抛出异常。你应该处理那个案子。

当您收到一个非空列表时,您必须将头部保留在原处并将尾部反向附加。换句话说,你可以将列表解构为头部和尾部,然后用头部和反转的尾部重建列表:

rvrsTail :: [x] -> [x]
rvrsTail [] = []
rvrsTail (listHead : listTail) = listHead : reverse listTail