2017-07-20 2 views
6

Haskell Neuling hier. Ich weiß aus type classes, dass => bedeutet "im Zusammenhang mit". Dennoch kann ich nicht die folgende Art lesen, in Modul gefunden Statistics.SampleWas ist dieser Typ?

(Vector v (Double, Double), Vector v Double) => v (Double, Double) -> Double 

Welche Einschränkungen für v links von => angewendet werden?

+0

Ich bin mir nicht sicher, wo Sie "im Zusammenhang mit von" bekommen haben. Was es bedeutet, ist näher zu "Wenn die Einschränkungen auf der linken Seite erfüllt sind, existiert eine Funktion mit dem Typ, der auf der rechten Seite angegeben ist". – Cubic

Antwort

10

Die Data.Vector.Generic.Vector typeclass nimmt zwei Argumente Typ, und va wo v :: * -> * die Art des Behälters und a :: * ist die Art der Elemente in dem Behälter. Dies ist einfach eine generische Schnittstelle für die im Paket vector definierten Vektortypen, insbesondere Data.Vector.Unboxed.Vector.

Dies bedeutet im Wesentlichen, dass der Typ v in der Lage sein muss (Double, Double) und Double zu halten, obwohl nicht gleichzeitig. Wenn Sie v ~ Data.Vector.Unboxed.Vector verwenden würden, dann funktioniert das ganz gut. Der Grund liegt an der Implementierung von correlation, die unzip verwendet. Diese Funktion teilt eine v (a, b) in (v a, v b). Da correlation an v (Double, Double) arbeitet, benötigt es die zusätzliche Einschränkung, die vDouble s halten kann.

Dieser generische Typ soll die Funktion correlation mit mehr Typen als Data.Vector.Vector arbeiten lassen, einschließlich aller Vektorstiltypen, die möglicherweise in anderen Bibliotheken implementiert sind.


Ich möchte betonen, dass diese Einschränkungen

Data.Vector.Generic.Vector v (Double, Double) 
Data.Vector.Generic.Vector v Double 

Staat, dass egal welcher Art Sie wählen, für v fähig ist (Double, Double) zu halten und ist auch in der Lage Double zu halten. Dies gibt bestimmte Voraussetzungen für Ihren Vektortyp an, nicht die tatsächlichen Inhalte des Vektors. Der tatsächliche Inhalt des Vektors wird im ersten Argument der correlation-Funktion angegeben.

+0

Also 'Foo a, Balken a => a -> Int 'erwartet, dass a entweder vom Typ Klasse Foo oder Bar ist? Was ist mit dem nächsten Teil der Signatur - warum wird 'v' als Tupel angegeben, anstatt nur' v', denn wir haben es bereits eingeschränkt? – Vorac

+0

Das würde sagen, dass 'a' Implementierungen für' Foo' und 'Bar' haben muss, auch nicht. Die Einschränkung wird mit "Tupelsyntax" angegeben, da dies die Syntax für mehrere Abhängigkeiten ist. Du müsstest eigentlich '(Foo a, Bar a) => a -> Int' machen, ohne die Parens wird es nicht kompiliert. Was ich oben sage, ist, dass "v" gezwungen ist, ein generischer "Vektor" zu sein, der '(Double, Double)' oder 'Double' enthalten kann. Das bedeutet nicht, dass es einen Vektor gibt, dessen Elemente gleichzeitig '(Double, Double)' und 'Double' sind (ich denke darüber nach, dass Python' [(1.0, 2.0), 3.0] ') kann. – bheklilr

+0

Python - das C der funktionalen Programmierung. – Vorac