GHC имеет несколько полезных языков расширений для механического получения различных стандартных типов Haskell (-XDeriveFunctor, -XDeriveFoldable, -XDeriveTraversable). Похоже, что Applicative - это еще один класс, который часто необходим и часто легко получается. Для простой записи, содержащей слоты типа a, например,
data SimpleRecord a = Simple a a a
экземпляр Applicative получается тривиально,
instance Applicative SimpleRecord where
pure x = Simple x x x
Simple a1 b1 c1 <*> Simple a2 b2 c2 = Simple (a1 a2) (b1 b2) (c1 c2)
Даже в немного более трудном случае, когда некоторые значения a зарываются в других аппликативных функторах, например,
data MyRecord f a = MyRecord (f a) a
разумный пример легко записывается,
instance (Applicative f) => Applicative (MyRecord f) where
pure x = MyRecord (pure x) x
MyRecord a1 b1 <*> MyRecord a2 b2 = MyRecord (a1 <*> a2) (b1 b1)
Почему расширение -XDeriveApplicative, реализующее эти виды механических экземпляров, не существует? Даже пакеты derive и generic-derive, по-видимому, не поддерживают Applicative. Существует ли теоретическая проблема, исключающая, что эти экземпляры обычно являются действительными (помимо тех причин, которые могут также угрожать расширениям Functor, Foldable или Traversable)?