Я понимаю определения foldl, foldr, но у меня проблемы с функциями, определенными ими.Определить функции с foldl foldr
Например карта с foldr:
map f [] = []
map f l = foldr (\x xs -> f x : xs) [] l
Я не понимаю (\x xs -> f x : xs)
. Это функция отображения, которую занимает foldr? Но не должно быть (\x xs -> f x : f xs)
, потому что map f (x:xs) = f x : map f xs
?
Пример с foldl:
concat (x:xs) = x ++ concat xs
concat' xs = foldl (++) [] xs
concat'' xs = foldl (\ys y -> ys ++ y) [] xs
Конечно, я понимаю (++)
, но что логика (\ys y -> ys ++ y)
? Это ys = []
и y = xs
? Таким образом, функция принимает []
как ys
и y
является первым элементом xs
и составляет []
с y
? Конкретный пример:
concat'' [1,2,3] = foldl (\ys y -> ys ++ y) [] [1,2,3]
=> foldl (\ys y -> ys ++ y) ((\ys y -> ys ++ y) [] [1]) [2,3]
=> foldl (\ys y -> ys ++ y) [1] [2,3]
=> foldl (\ys y -> ys ++ y) ((\ys y -> ys ++ y) [1] [2]) [3]
=> foldl (\ys y -> ys ++ y) [1,2] [3]
=> foldl (\ys y -> ys ++ y) ((\ys y -> ys ++ y) [1,2] [3]) []
=> foldl (\ys y -> ys ++ y) [1,2,3] []
=> [1,2,3]
Другое дело: concat
занимает всего 1 список xs
, так что если я хочу Concat 2 списка?
concat (x:xs) ys = x ++ concat xs ys
concat [1,2,3] [4,5,6] with foldl?
Реверс:
reverse (x:xs) = reverse xs ++ [x]
reverse' l = foldl (\xs x -> [x] : xs) [] l
reverse'' l = foldr (\x xs -> xs ++ [x]) [] l
foldr интуитивно понятно (с вопросами из выше), но то, что за обратным порядком в foldl (\xs x -> [x] : xs)
? Это будет foldl (\x xs -> xs ++ [x]) [] l
, не так ли?
Большое спасибо!
вот пара вопросов - для первого заметим, что 'xs' re уже * был * отображен на 'f' (посмотрите на определение' foldr', чтобы понять, почему) (также 'f xs' не был бы хорошо напечатан, так как у вас был' f :: a -> b' и на в то же время 'f :: [a] -> b'', поэтому вам нужно будет идентифицировать' a ~ [a] ') – Carsten
Обратите внимание, что' foldr fz [x1, x2, x3] = f x1 (f x2 (f x3 z)), поэтому 'xs' уже был сопоставлен' f'. – Bakuriu
для второго: просто отметьте, что 'foldl' будет * loop * через' xs' слева (снова посмотрите на определение) – Carsten