warum Functor muss höher sein kinded Typ
Functor
höher kinded sein muss, weil wir abstrakt über einen Typparameter wollen, die selbst eine Art Parameter annimmt.
Die Typen, die Functor
behandelt, werden als "Arten erster Ordnung" bezeichnet und ihre Art ist * -> *
. Wenn Sie sich die Implementierungen ansehen, die Sie für eine Functor
bereitstellen, ist es sinnvoll, dass wir den inneren Typparameter abstrahieren. Wenn Sie beispielsweise einen Funktor für List
definieren, definieren Sie ihn wie in Ihrem Beispiel als Functor[List]
. Wie Sie sehen, erstellen wir keinen Funktor für einen bestimmten List[Int]
, sondern einen beliebigen Typ-Parameter, der in einem List
enthalten ist. Diese Abstraktion bringt große Kraft, denn sobald Sie eine solche Typklasse definiert haben, können Sie sie für einen beliebigen Typ List
verwenden, sei es List[String]
oder List[Int]
.
ich immer das Bild von Adriaan Moore in seinem Vortrag "Genrics von höherer Art" gezogen hinweisen:
Was der Typparameter F wirklich bedeutet
F
Der einzige Zweck besteht darin, einen Vertrag mit dem Implementierer der Functor
zu definieren. Durch die Signatur F
können wir ableiten, welche Art von Typ Functor
erwartet. Wenn wir sehen, dass es einen "Platzhalter" ([_]
) hat, wissen wir per Konvention, dass dies bedeutet, dass F
einen einzigen Typparameter annehmen sollte. Wenn wir über alle Typen denken, die einen einzigen Typ Parameter nehmen, können wir sehen, dass es viele, zum Beispiel List
, Option
, Try
, Future
, Task
usw.
Für eine breite Erklärung in Bezug auf höhere kinded Typen, siehe What is a higher kinded type in Scala?
Functor ist eine gemeinsame Schnittstelle für viele (höherwertige) Typen wie List und Option. Der Typparameter F sagt "das ist der Typ, für den wir unsere Schnittstelle definieren". –
Danke @ n.m. Ihre Erklärung ergibt sich aus der Sicht des Codes. Ich möchte fragen, warum Funktor Form wie 'Functor [F [_]]' nimmt. Es scheint mir, dass Funktor versucht, F [A] zu F [B] zu transformieren, vorausgesetzt, A => B, Fs Bedeutung spielt hier keine Rolle. Es kann ein Container oder ein Kontext oder ein anderer sein, solange F [A] und F [B] sinnvoll sind. – Tom
Wäre es nicht höher als das, was die Signatur von 'map' aussehen würde? – sepp2k