Я играл с функторами, и я заметил что-то интересное:
Тривиально, 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.