Я недавно начал изучать Haskell, и в одном из моих заданий у меня есть упражнение, которое просит определить функцию карты в терминах foldr, и я не могу, хоть убей, понять, как это сделать. Я искал решения по переполнению стека и наткнулся на это:
Как бы вы определяли карту и фильтр с помощью foldr в Haskell?
Однако здесь решение включает использование лямбд, которые я еще не рассмотрел, и я предполагаю, что из-за этого упражнение должно выполняться без лямбд (хотя вы никогда не знаете).
Я думаю, что меня больше всего смущает то, что map принимает унарную функцию (например, +1), тогда как foldr принимает двоичную функцию (например, +), и я действительно не понимаю, как заставить эти два работать вместе.
id :: [a] -> [a]
сfoldr
. Затем помните, чтоid :: [a] -> [a]
- это то же самое, чтоmap (id :: a -> a)
, и выясните, где вам нужно применить дополнительную функцию. - person Carl   schedule 03.12.2013left_fold f z xs = let rs = z : zipWith f xs rs in last rs
; zipWith - это карта:zipWith f a b = map (uncurry f) $ zip a b
(хотяlast
- своего рода складка ... (?)). Но, игнорируя это,rev xs = left_fold (flip (:)) [] xs
(реверс - левая складка); а затемright_fold f z xs = let rs = z : zipWith f (rev xs) rs in last rs
. ср. stackoverflow.com/a/11951590/849891. - person Will Ness   schedule 04.12.2013