Ответ 1
Основное место, где я вижу функтор, но не аппликаторы, - это большие типы продуктов. Рассмотрим что-то вроде
data Mean where
Unfair :: Monad a => a () -> Mean
data Foo a = Bar Int Mean a
Это легко функтор, но нет способа сделать это аппликативным, потому что
(Bar i g f) (Bar i' g' a) = Bar ??? ??? (f a)
Мы можем только заполнить наш ???
чем-то, что моноидоподобным, по крайней мере, одним способом и Mean
никогда не будет, поскольку у нас нет способа указать что-либо, чтобы объединить два значения произвольных типов g :: a
и g' :: b
ассоциативным способом.
Кроме того, нам нужен mempty
или что-то вроде этого для pure :: a -> f a
. Нам дается a
, поэтому большая часть типа данных, который включает a
, тривиальна для построения, но для остальных требуется разумное "пустое" значение.
Итак, если бы мы разбили аппликативный и функтор в один класс большого типа, большая часть lens
распалась бы, потому что большинство полезных случаев для объектива включали ситуации, подобные этим, где нет разумного экземпляра Applicative
.
Итак, чтобы разбить это на ручную волнующе: когда существует много "вещей" в типе, который непосредственно не связан с аппликативным параметром типа, нам нужен способ объединить все этот "материал", который не всегда возможен.