Scala - Wie benutzt man Funktoren für Nicht-Funktionstypen?

8

Beim Lesen der Beschreibung von Functors in diesem Blog:

Ссылка

Es gibt eine generische Definition von Functor und eine spezifischere:

%Vor%

Offensichtlich bedeutet dies, dass Funktoren mit anderen höherwertigen Typen neben Funktionsobjekten verwendet werden können. Könnte jemand bitte ein Beispiel geben oder erklären, wie oder warum oder in welchem ​​Szenario das gemacht würde? Was wäre eine andere Implementierung von GenericFunctor in Scala - die einen anderen Typkonstruktor von Function verwendet? Danke!

BEARBEITEN:

Nur um klarzustellen:

%Vor%

Nur um zu verdeutlichen, implementiert ListFunctor die 1-arg fmap in GenericFunctor, während der Code im repl transcript die fmap in Trait Functor aufruft, der wiederum eine fmap-Implementierung aufruft (zB in ListFunctor).

>

Dies ändert nichts an der allgemeinen Frage, nur gedacht, dass es Leuten helfen würde, Antworten zu geben. Irgendwelche Einblicke würden geschätzt werden.

    
david 27.09.2011, 15:46
quelle

3 Antworten

7

In Ihrem Beispiel ist Functor ein endofunctor in der Kategorie Scala-Typen mit Function1 als Pfeilen.

Es gibt andere Kategorien. Stellen Sie sich beispielsweise eine Kategorie vor, in der die Objekte Scala-Typen sind, und es gibt einen Pfeil A >~> B , wenn B ein Untertyp von A ist. Diese Kategorie in Scalaz heißt Liskov . Es gibt einen "vergesslichen" Funktor aus der Kategorie Liskov in die Kategorie Function1 :

%Vor%

Beachten Sie, dass Sie einige interessante Funktoren erstellen können, indem Sie eines oder mehrere der Argumente auf GenericFunctor festlegen. Zum Beispiel ...

Ein konstanter Funktor ordnet jedes Objekt in einer Kategorie einem einzelnen Objekt in einem anderen zu:

%Vor%

Ein endofunctor ordnet eine Kategorie sich selbst zu:

%Vor%

Ein Identitätsfunktor ordnet jedes Objekt und jeden Pfeil sich selbst zu:

%Vor%

Und natürlich ist Ihr Functor Merkmal nur ein EndoFunctor in der Kategorie Function1 .

%Vor%     
Apocalisp 27.09.2011, 23:56
quelle
6

Sie können sich einen Funktor vorstellen, der eine Instanz von Either[A,B] in eine Either[F[A],F[B]] hebt, wobei F eine List , Option usw. sein kann.

BEARBEITEN Implementierungsbeispiel:

%Vor%

EDIT2 Ein anderes (vielleicht nützliches) Beispiel ist mit einem Funktor mit goes von PartialFunction (Typ ->> ) zu einem Function (Typ ->>> ):

%Vor%

Dieses zweite Beispiel erlaubt es, die Operation collect so zu implementieren, wie sie in Scala-Sammlungen definiert ist:

%Vor%     
paradigmatic 27.09.2011 16:45
quelle
4

Data.Category ist eine gute Quelle für Beispiele für solche Dinge (in Haskell). Teilweise eine der Instanzen aus Ссылка übersetzen :

%Vor%     
Alexey Romanov 27.09.2011 17:38
quelle