5

Ich kann es nicht wirklich bekommen. Warum brauchen wir es überhaupt? Ich meine, wenn ich den gleichen Typparameter verwende, denke ich, dass sie vom selben Typ sein sollten.Funktionale Abhängigkeit in Haskell

Ich habe gehört, dass es dem Compiler helfen kann, die Endlosschleife zu vermeiden. Kann mir jemand mehr dazu erzählen?

Am Ende, gibt es irgendwelche "Muster und Praktiken" sollten wir auf die Nutzung der funktionalen Abhängigkeit in Real World Haskell folgen?

[Follow-up-Frage]

class Extract container element where 
    extract :: container -> element 

instance Extract (a,b) a where 
    extract (x,_) = x 

In dem obigen Code, habe ich die gleiche Art Variable 'a' sowohl für Container- und Element, ich glaube, der Compiler kann also daraus schließen, dass diese beiden Typen sind vom selben Typ.

Aber wenn ich diesen Code in GHCi versuchte, bekam ich folgendes Feedback:

*Main> extract('x',3) 
<interactive>:1:0: 
    No instance for (Extract (Char, t) element) 
     arising from a use of `extract' at <interactive>:1:0-13 
    Possible fix: 
     add an instance declaration for (Extract (Char, t) element) 
    In the expression: extract ('x', 3) 
    In the definition of `it': it = extract ('x', 3) 

Als einer von ihnen angegeben wurde Typ ‚Char‘ zu sein, warum die andere nach wie vor ungelöst Typ ‚Element '?

+5

hilft http://www.haskell.org/haskellwiki/Funktionale_abhängigkeiten? – lijie

Antwort

6

Ich dachte das explains es ziemlich gut. Also im Grunde, wenn Sie eine FD-Beziehung von a -> b haben bedeutet es, dass für Typ-Klasse Instanz kann nur ein 'b' mit einem 'a' so Int Int, aber Sie können nicht Int Float auch haben . Das meinen sie, wenn man sagt, dass "b" eindeutig aus "a" bestimmt wird. Dies erstreckt sich auf eine beliebige Anzahl von Typ-Parametern. Der Grund, warum es benötigt wird, ist 1. Tipp Inferenz 2. Manchmal möchten Sie eine Einschränkung wie folgt.

Eine Alternative zu FDs ist die Typfamilienerweiterung, aber nicht für alle Fälle von FDs.

+0

Vielen Dank für Ihr Feedback. Dieser Artikel ist großartig. Jetzt weiß ich genau, was meine eigentliche Frage ist. Du sagtest 'manchmal willst du so eine Einschränkung'. Ich verstehe diesen Teil. Aber ich verstehe nicht, warum es für die Typinferenz benötigt wird. Ich habe meine Frage mit einer weiteren Folgefrage aktualisiert. Das Beispiel stammt von der oben erwähnten Wiki-Seite. – aXqd

+0

Ich habe es endlich herausgefunden. Der Compiler versucht immer noch, die richtige Instanz von typeclass zu finden, daher hat er noch nichts mit dieser spezifischen Instanz zu tun. Ich gebe den Rückgabetyp nicht, daher ist es mehrdeutig. – aXqd

+0

Wenn ich eine funktionale Abhängigkeit hinzufüge, kann der Compiler sicher sein, dass der Compiler diese Instanz verwenden kann, solange der Typ des Containers eine Übereinstimmung findet, da er jetzt nur EINE Art von Rückgabetyp haben kann. – aXqd

Verwandte Themen