2012-05-08 6 views

Antwort

5

Es sollte nicht.

Sie können eine Analogie mit Werten und Funktionen erstellen. Sie haben Grundwerte, die keine Funktionen sind, wie 5 und "foo". Sie haben dann einfache Funktionen, die einfache Werte als Argumente annehmen und einfache Werte wie + oder length zurückgeben. Funktionen höherer Ordnung sind Funktionen, die andere Funktionen als Parameter oder Ergebnis haben. Zum Beispiel sind takeWhile, map oder foldLeft Funktionen höherer Ordnung.

Wenn man bedenkt, Typen gibt es einfache Typen, die die tatsächlichen Arten von Werten sind, wie Int, String oder sogar Int => String und List [Double] (jetzt halte ich alle Werte, einfach oder nicht, einschließlich Funktionen) . Dann gibt es Parametertypen, die auch als Typkonstruktoren bezeichnet werden können (das Aufrufen von Typfunktionen würde die Analogie deutlicher machen). Liste (ohne den generischen Parameter zu instanziieren) ist nicht wirklich ein Typ für Werte, Sie können kein val als nur vom Typ List deklarieren, es muss List[Something] sein. So kann List als eine Funktion betrachtet werden, die bei einem einfachen Typ (zB Int) einen anderen einfachen Typ (List [Int]) zurückgibt. Int, String und Double und Int => String sollen Art* haben, während List hat Art * -> *. Parametrische Typen wie List oder Map sind analog zu einfachen Funktionen.

Genau wie eine Funktion höherer Ordnung eine Funktion mit Funktion (anstelle von einfachem Wert) ist, ist ein höherer Ordnungstyp (oder manchmal höher kinded) ein Typ, der einen Typkonstruktorparameter und nicht nur einfache Typparameter hat. Es hat Art (* -> *) -> *, oder etwas Komplexeres. Sie werden mit HigherOrder[C[_]] oder HigherOrder[C[X]] deklariert, um festzustellen, dass der Typparameter C selbst ein parametrischer Typ oder Typkonstruktor ist. Beachten Sie, dass dies in der Typdeklaration und nicht in der Typinstanziierung erscheinen muss. List ist Merkmal List[A], so ist es parametrisch, aber nicht höherer Ordnung. Wenn Sie eine mit List[Seq[Map[Int, Set[Double]]] instanziieren, wird das List 's Bestellung höher nicht machen. Ein höherer Auftragstyp würde List (statt List[Int]) als seinen Parameter annehmen, könnte man val x : HigherOrder[List] = ... erklären.

Höhere Ordnung Typen sind nicht allzu häufig in der Bibliothek, können Sie einige in den blutigen Details der Sammlung Bibliothek, wie GenericCompanion. Sie können viele von ihnen in Scalaz finden.

9

Was Sie haben, ist kein höher-kinkender Typ, aber es könnte ziemlich leicht modifiziert werden, um so zu sein.

type MyMap2[A,B,C] = Map[A, List[Map[B, C]]] 

Jetzt können wir MyMap erneut erstellen, indem Parameter des Typs bereitstellt.

type MyMap = MyMap2[String, Int, String] 

„Higher-kinded“ bedeutet nur, dass es eine Art ist, die unbewohnt ist, und muss mit anderen Typen vorgesehen, um werden, um einen bewohnbaren Typen zu erstellen.