Haskell获取列表的第一个字符,并附加到该列表的末尾

Haskell获取列表的第一个字符,并附加到该列表的末尾,haskell,tail,Haskell,Tail,鉴于: 我想做一些类似的事情: mangle :: String -> String 但是: 希望将列表的第一个字符附加到该列表的末尾,并剪切该第一个字符。非常简单的解决方案如下所示: mangle xs = tail xs ++ head xs -- won't work at all! [head xs]将字符转换为字符串,因此您可以附加它,但您的函数不安全。请不要使用head,tail,而是使用模式匹配。@Michael Kohl:谢谢!这真的很简单。“你应该知道的。”@Chi:

鉴于:

我想做一些类似的事情:

mangle :: String -> String
但是:


希望将列表的第一个字符附加到该列表的末尾,并剪切该第一个字符。

非常简单的解决方案如下所示:

mangle xs = tail xs ++ head xs -- won't work at all!

[head xs]
将字符转换为字符串,因此您可以附加它,但您的函数不安全。请不要使用
head,tail
,而是使用模式匹配。@Michael Kohl:谢谢!这真的很简单。“你应该知道的。”@Chi:为什么不用头或尾巴呢?你可以做一个“错误”子句。很抱歉,但在我看来,模式匹配使它变得比必要的更复杂。注意:我是一个初学者,开始掌握Haskell;-)的力量(和复杂性)@Madderote
head和tail
是部分操作:当它们被输入一个空列表时,它们将使程序崩溃。模式匹配通常也更容易编写,例如,将代码与
mangle(x:xs)=xs++[x]
进行比较。此外,启用警告将使GHC在模式匹配中报告丢失的案例。像if(x.canFoo()){x.foo()}这样的代码在Java中很常见,如果我们忘记前面的检查,x.foo()将崩溃。在Haskell中,类似的代码是一种反模式,因为(穷举)模式匹配是一种更安全且通常更简单的选择。
mangle xs = tail xs ++ head xs -- won't work at all!
mangle :: String -> String
mangle [] = []
mangle (x:xs) = xs ++ [x]