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
)?