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.
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
:
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
.
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 ->>>
):
Dieses zweite Beispiel erlaubt es, die Operation collect
so zu implementieren, wie sie in Scala-Sammlungen definiert ist:
Data.Category
ist eine gute Quelle für Beispiele für solche Dinge (in Haskell). Teilweise eine der Instanzen aus Ссылка übersetzen :
Tags und Links scala functional-programming function category-theory functor