Я занимаюсь самостоятельным изучением функциональных языков (в настоящее время использую Haskell). Я столкнулся с назначением на основе Haskell, которое требует определения карты и фильтра в терминах foldr. Для жизни меня я не совсем понимаю, как это сделать.
Например, когда я определяю функцию отображения, например:
map' :: (a -> b) -> [a] -> [b]
map' f [] = []
map' f (x:xs) = foldr (\x xs -> (f x):xs) [] xs
Я не знаю, почему первый элемент списка всегда игнорируется. Это означает, что:
map' (*2) [1,2,3,4]
приводит к [4,6,8] вместо [2,4,6,8]
Аналогично, моя функция фильтра:
filter' :: (a -> Bool) -> [a] -> [a]
filter' p [] = []
filter' p (x:xs) = foldr (\x xs -> if p x then x:xs else xs ) [] xs
при запуске как:
filter' even [2,3,4,5,6]
приводит к [4,6] вместо [2,4,6]
Почему это так? И как СЛЕДУЕТ Я определил эти функции, чтобы получить ожидаемые результаты? Я предполагаю, что что-то не так с моими лямбда-выражениями...