2017-08-27 4 views
2

Ich habe folgende Funktors DefinitionWarum ist Functor ein höherer Kinded Typ

trait Functor[F[_]] { 
    def map[A, B](fa: F[A])(f: A => B): F[B] 
} 
object ListFunctor extends Functor[List] { // 
    def map[A, B](f: A => B)(data: List[A]): List[B] = data map f 
} 

In scala, ist es sehr üblich, dass F ist eine Sammlung Art, wie List, Seq, Option, würde ich fragen, warum Functor muss höher sein kinded Typ, und was bedeutet der Typ Parameter F wirklich?

+0

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". –

+0

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

+0

Wäre es nicht höher als das, was die Signatur von 'map' aussehen würde? – sepp2k

Antwort

2

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:

Higher Kinds

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?

+0

tl; dr: Per Definition. :) Natürlich, wenn Higher-Kinded Type bereits definiert ist. – pedrofurla

0

Ich würde das ein bisschen anders beantworten. Das Vorhandensein eines (höherwertigen) Typ-Parameters F[_] in Functor Signatur bedeutet Functor ist eine Typenklasse. Typklassen ist eine Scala-Funktion, die es ermöglicht, vorhandenen Typen Features hinzuzufügen, ohne sie zu ändern. Also hier ist kein einziger Typ, sondern ein Bauplan für viele andere Arten. Mit anderen Worten, es ist kein einzelner Typ, sondern eine Klasse von Typen, daher das Wort "typeclass".

Jetzt zum Erstellen eines konkreten Funktors, z. Funktor der Liste, muss man diesen konkreten Typ als Typparameter an diesen Bauplan übergeben, und dieser konkrete Typ selbst muss einen Typparameter haben, durch mathematische Definition von funktor, wenn Sie es wünschen. Dies ist, was höher-kinded Typ F[_] in Functor Signatur bedeutet.

Verwandte Themen