Я играл с функторами, и я заметил что-то интересное:
Тривиально, id может быть создан в типе (a -> b) -> a -> b.
С функтором списка имеем fmap :: (a -> b) -> [a] -> [b], что совпадает с map.
В случае функтора ((->) r) (из Control.Monad.Instances), fmap является композицией функций, поэтому мы можем создать экземпляр fmap fmap fmap :: (a -> b) -> [[a]] -> [[b]], что эквивалентно (map . map).
Интересно, что fmap восемь раз дает нам (map . map . map)!
Итак, мы имеем
0: id = id
1: fmap = map
3: fmap fmap fmap = (map . map)
8: fmap fmap fmap fmap fmap fmap fmap fmap = (map . map . map)
Продолжается ли этот шаблон? Почему, почему нет? Есть ли формула для количества fmap Мне нужно отобразить функцию по n-разному вложенному списку?
Я попробовал написать тест script для поиска решения для случая n = 4, но GHC начинает потреблять слишком много памяти около 40 fmap s.