Concat两个列表定义折叠

P_F*_*ira 2 haskell concat fold

我想(++) :: [a] -> [a] -> [a]用折叠做.我做的:

plusplus :: [a]->[a]->[a]
plusplus l = foldr (\x l1 -> x:l1) l
Run Code Online (Sandbox Code Playgroud)

但我得到了反转顺序.例如:

plusplus [1,2,3] [4,5,6]
Output: [4,5,6,1,2,3]
Run Code Online (Sandbox Code Playgroud)

我理解为什么我要这样做,但我仍然不知道如何解决这个问题.

编辑:我发布了错误的解决方案,抱歉.

chi*_*chi 7

我们从错误的代码开始:

plusplus :: [a]->[a]->[a]
plusplus l = foldr (\x l1 -> x:l1) l
Run Code Online (Sandbox Code Playgroud)

我们继续扩展所以提到第二个论点:

plusplus :: [a]->[a]->[a]
plusplus xs ys = foldr (\x l1 -> x:l1) xs ys
Run Code Online (Sandbox Code Playgroud)

这以相反的顺序附加,所以我们翻转参数来修复它:

plusplus :: [a]->[a]->[a]
plusplus xs ys = foldr (\x l1 -> x:l1) ys xs
Run Code Online (Sandbox Code Playgroud)

进一步收尾:

plusplus :: [a]->[a]->[a]
plusplus xs ys = foldr (:) ys xs


plusplus :: [a]->[a]->[a]
plusplus xs ys = flip (foldr (:)) xs ys


plusplus :: [a]->[a]->[a]
plusplus = flip (foldr (:))
Run Code Online (Sandbox Code Playgroud)

最后一个是有点神秘,但并不过分.

我自己的首选变体是有点的foldr (:) ys xs,可以理解如下.取出xs,(:)(:)(无操作)替换其中的每一个,并[]ys.替换最终.