Я читал, что map
можно определить с помощью foldr
, т.е. это примитивная рекурсивная функция. По крайней мере для списков.
Теперь мой вопрос: почему Functor не является подклассом Foldable? И если fmap
можно определить только в терминах foldr
для списков, что делает их особенными?
Глядя на определение map
с foldr:
myMap f xs = foldr step [] xs
where step x ys = f x : ys
Я мог бы использовать моноиды, чтобы добраться до:
myMap f xs = foldr step mempty xs
where step x ys = f x : ys
Но, к сожалению, я недостаточно хорошо разбираюсь в Haskell, чтобы сойти с рук cons
.
IO
является функтором. Допустим, естьx = readLn :: IO Int
.foldr (+) 0 x
должно бытьInt
. Что это? - person Ry-♦   schedule 17.03.2017Applicative
иFunctor
. Просто каждыйApplicative
должен быть экземпляромFunctor
- person hgiesel   schedule 17.03.2017Foldable
слишком ориентирован на список, он в основном позволяет эффективно запускатьfoldr f x . toList
. Он не будет различать деревья с одинаковым посещением по порядку. Вместо этогоfmap f
сохранит всю древовидную структуру. - person chi   schedule 17.03.2017