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)
我理解为什么我要这样做,但我仍然不知道如何解决这个问题.
编辑:我发布了错误的解决方案,抱歉.
我们从错误的代码开始:
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.替换最终.