2013-12-11 16 views
9

Was ist die Motivation für funktionale Abhängigkeiten in Haskell?Motivation der funktionalen Abhängigkeiten

Ein Beispiel für eine funktionale Abhängigkeit:

class (Monad m) => MonadSupply s m | m -> s where 
    next :: m (Maybe s) 

Es ist in dem RWH Buch angegeben, dass funktionale Abhängigkeit hilft, den Typ-Checker. Wie hilft es eigentlich?

Auch dieses Stück Code kompiliert tatsächlich:

class (Monad m) => MonadSupply s m where 
     next :: m (Maybe s) 

Aber ich denke, es wird ein Laufzeitfehler erzeugen.

Antwort

8

Es ist vollkommen in Ordnung, Code ohne funktionale Abhängigkeiten zu schreiben, es ist nur ein Schmerz zu verwenden, da die Inferenz saugt.

Grundsätzlich ohne FDs muss die Funktion get :: MonadState m s => m sm und s unabhängig herausfinden. Normalerweise wird m relativ einfach abgeleitet, aber oft benötigt s eine explizite Anmerkung.

Darüber hinaus ist diese viel allgemeiner ist als wir brauchen, so stattdessen können wir unsere typechecker beschränken zu sagen: „Für m gibt es genau 1 s“, auf diese Weise, sobald m geschlossen wird, ist s offensichtlich für den Typinferenz Algorithmus

+0

Ich kann nicht verstehen, wie 'Für m, gibt es genau 1 s'. Wenn wir sagen, für 'm' gibt es genau ein' s', dann warum schreiben Sie sie nicht als 'MonadSupply m m'? (Ich weiß, dass ich verrückt bin :)) – Sibi

+0

@Sibi Da 's' normalerweise anders ist, zum Beispiel mit' MonadState', haben wir 'StateT s' und' s', klar für alle 'StateT's wir wirklich will nur 's' benutzen. – jozefg

+0

Jede gegebene "Versorgungs-Monade" liefert normalerweise nur einen Typ! Wenn Sie zum Beispiel 'm = MySpecialSupplyMonad s' haben, die Werte vom Typ' s' liefern, dann wissen Sie vom Typ "MySpecialSupplyMonad s'" den Versorgungstyp, indem Sie einfach das Typargument "' s' "lesen. So kann gesagt werden, dass "s" funktional von "m" abhängt. –

Verwandte Themen