我正在尝试在haskell中编写一个函数来递归地反转列表。我写了一个辅助函数,它接受原始列表和一个空列表,然后以LIFO模式将元素从第一个传递到另一个。
这就是我所拥有的:
myreverse :: [a] -> [a]
myreverse list = myflip list []
myflip :: [a] -> [a] -> [a]
myflip list1 newList
| null list1 = newList
| otherwise = myflip (tail list1) ((head list1) : newList)
我知道有一个内置函数可以帮我,但要求是我只使用 head , tail , elem 和 null (也没有模式匹配)。所以我的问题是:有没有更好的解决方案,我只有一个函数,myreverse,只消耗一个列表? (当然,这符合上述要求)
谢谢!
答案 0 :(得分:7)
您可以尝试使用foldl
来反转列表,如下所示:
reverse' :: [a] -> [a]
reverse' = foldl (\acc x -> x : acc) []
答案 1 :(得分:0)
此功能满足您的要求,但效率低下:
rev xs = if null xs then xs else rev (tail xs) ++ [head xs]
你的解决方案一点都不差。使用模式匹配并使myFlip
成为本地函数后,它看起来不会很难看。使用带累加器的局部函数的技术非常普遍(尽管不是在这种简单的情况下)。
答案 2 :(得分:0)
除了满足您的额外要求所需的调整之外,您的功能与reverse
is implemented in GHC的方式相同。因此,我认为你的功能非常好。
答案 3 :(得分:0)
所以对于任何可能感兴趣的人来说,这就是我最后写的:
myreverse :: [a] -> [a]
myreverse list = myflip list []
where myflip list newList = if null list then newList
else myflip (tail list) ((head list):newList)
感谢大家的意见和建议。
答案 4 :(得分:0)
将此内容保存为reverse.hs文件
reverseString :: [Char] -> [Char]
reverseString [] = []
reverseString (x:xs) = reverseString xs ++ [x]
然后运行 reverseString“ abc”
cba