用折叠连接两个列表定义
Concat two lists definition with fold
我想(++) :: [a] -> [a] -> [a]
折叠起来。
我做了这个:
plusplus :: [a]->[a]->[a]
plusplus l = foldr (\x l1 -> x:l1) l
但我收到了逆向订单。例如:
plusplus [1,2,3] [4,5,6]
Output: [4,5,6,1,2,3]
我明白为什么我会收到这个,但我仍然不知道如何解决这个问题。
编辑:我发布了错误的解决方案,抱歉。
您使用的 fold
是错误的。
看看wiki haskell's page on foldr, foldl, and foldl'。
foldr
将第一个参数放在末尾(将其视为 "right")
foldl
逻辑上将第一个参数放在开头(将其视为 "left")
当你像这样想到不同的褶皱时,它们的名字就会变得更加清晰。就是右折左折!
因此要正确使用订单:
plusplus :: [a]->[a]->[a]
plusplus l = foldl (\x l1 -> x:l1) l
我们从你的错误代码开始:
plusplus :: [a]->[a]->[a]
plusplus l = foldr (\x l1 -> x:l1) l
我们 eta-expand 所以提到第二个参数:
plusplus :: [a]->[a]->[a]
plusplus xs ys = foldr (\x l1 -> x:l1) xs ys
这是以相反的顺序附加的,所以我们翻转参数来修复它:
plusplus :: [a]->[a]->[a]
plusplus xs ys = foldr (\x l1 -> x:l1) ys xs
进一步的收尾工作:
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 (:))
最后一个有点神秘,但并不过分。
我自己比较喜欢的变体是pointful foldr (:) ys xs
,可以这样理解。取 xs
,将其中的每个 (:)
替换为 (:)
(无操作),并将最后的 []
替换为 ys
.
我想(++) :: [a] -> [a] -> [a]
折叠起来。
我做了这个:
plusplus :: [a]->[a]->[a]
plusplus l = foldr (\x l1 -> x:l1) l
但我收到了逆向订单。例如:
plusplus [1,2,3] [4,5,6]
Output: [4,5,6,1,2,3]
我明白为什么我会收到这个,但我仍然不知道如何解决这个问题。
编辑:我发布了错误的解决方案,抱歉。
您使用的 fold
是错误的。
看看wiki haskell's page on foldr, foldl, and foldl'。
foldr
将第一个参数放在末尾(将其视为 "right")
foldl
逻辑上将第一个参数放在开头(将其视为 "left")
当你像这样想到不同的褶皱时,它们的名字就会变得更加清晰。就是右折左折!
因此要正确使用订单:
plusplus :: [a]->[a]->[a]
plusplus l = foldl (\x l1 -> x:l1) l
我们从你的错误代码开始:
plusplus :: [a]->[a]->[a]
plusplus l = foldr (\x l1 -> x:l1) l
我们 eta-expand 所以提到第二个参数:
plusplus :: [a]->[a]->[a]
plusplus xs ys = foldr (\x l1 -> x:l1) xs ys
这是以相反的顺序附加的,所以我们翻转参数来修复它:
plusplus :: [a]->[a]->[a]
plusplus xs ys = foldr (\x l1 -> x:l1) ys xs
进一步的收尾工作:
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 (:))
最后一个有点神秘,但并不过分。
我自己比较喜欢的变体是pointful foldr (:) ys xs
,可以这样理解。取 xs
,将其中的每个 (:)
替换为 (:)
(无操作),并将最后的 []
替换为 ys
.