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

时间:2015-07-24 13:05:47

标签: list haskell reverse

我在以下练习中遇到了麻烦:

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

更正示例:

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]

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

2 个答案:

答案 0 :(得分:5)

当您收到非空列表时,您必须将头部留在原位并将尾部反转。换句话说,您可以将列表解构为头部和尾部,然后使用该头部和反向尾部重建列表:

BufferedReader br = ...;
TimeLimiter timeLimiter = new SimpleTimeLimiter();

try {
    String line = timeLimiter.callWithTimeout(br::readLine, 10, TimeUnit.SECONDS);
} catch (TimeoutException | UncheckedTimeoutException e) {
    // timed out
} catch (Exception e) {
    // something bad happened while reading the line
}

答案 1 :(得分:4)

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

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

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