Haskell Language Dépendances fonctionnelles


Exemple

Si vous avez une classe de type multi-paramètres avec les arguments a, b, c et x, cette extension vous permet d'exprimer que le type x peut être identifié de manière unique à partir de a, b et c:

class SomeClass a b c x | a b c -> x where ...

Lors de la déclaration d'une instance de cette classe, elle sera vérifiée par rapport à toutes les autres instances pour s'assurer que la dépendance fonctionnelle est maintenue, c'est-à-dire qu'aucune autre instance avec le même abc mais un x différent n'existe.

Vous pouvez spécifier plusieurs dépendances dans une liste séparée par des virgules:

class OtherClass a b c d | a b -> c d, a d -> b where ...

Par exemple dans MTL on peut voir:

class MonadReader r m| m -> r where ...
instance MonadReader r ((->) r) where ...

Maintenant, si vous avez une valeur de type MonadReader a ((->) Foo) => a , le compilateur peut en déduire a ~ Foo , puisque le second argument détermine complètement le premier et simplifiera le type en conséquence.

La classe SomeClass peut être considérée comme une fonction des arguments abc qui donnent x . De telles classes peuvent être utilisées pour effectuer des calculs dans le système de types.