Dans cette récente réponse de la mienne, il m'est arrivé d'en casser ce vieux châtaignier (un programme si vieux, la moitié de ce qui était écrit dans le dix-septième siècle par Leibniz et écrit sur un ordinateur dans les années soixante par mon papa). Je vais laisser le moderne à économiser de l'espace.
class Differentiable f where
type D f :: * -> *
newtype K a x = K a
newtype I x = I x
data (f :+: g) x = L (f x)
| R (g x)
data (f :*: g) x = f x :&: g x
instance Differentiable (K a) where
type D (K a) = K Void
instance Differentiable I where
type D I = K ()
instance (Differentiable f, Differentiable g) => Differentiable (f :+: g) where
type D (f :+: g) = D f :+: D g
instance (Differentiable f, Differentiable g) => Differentiable (f :*: g) where
type D (f :*: g) = (D f :*: g) :+: (f :*: D g)
Maintenant, voici la chose frustrante. Je ne sais pas comment faire pour prévoir qu' D f
doit lui-même être dérivable. Certes, ces instances à l'égard de cette propriété, et il peut très bien être amusant de programmes que vous pouvez écrire, qui font usage de la possibilité de garder la différentiation d'un foncteur, prise de vue trous de plus en plus: Taylor expansions, ce genre de chose.
Je voudrais être en mesure de dire quelque chose comme
class Differentiable f where
type D f
instance Differentiable (D f)
et exigent un contrôle de cette instance déclarations ont type
définitions pour qui le nécessaire instances existent.
Peut-être plus terre à terre des trucs comme
class SortContainer c where
type WhatsIn c
instance Ord (WhatsIn c)
...
serait aussi agréable. Qui, bien sûr, a la fundep solution de contournement
class Ord w => SortContainer c w | c -> w where ...
mais pour tenter le même truc pour Differentiable
semble... bien... compliquée.
Alors, est-il une chouette solution de contournement qui me fait reproductible différentiabilité? (Je suppose que je pourrais construire une représentation GADT et et et... mais est-il une manière qui fonctionne avec des classes?)
Et il y a de toute évidence des chicots avec la suggestion que nous devrions être en mesure de l'insuffisance de la demande sur le type (et, je suppose, de données) des familles lors de la déclaration d'eux, puis vérifiez que les instances les satisfaire?