Lets sagen, ich habe die folgendetypeclass für (was zu sein scheint) eine kontra Funktors Implementierung Funktion Inversion
import Control.Category (Category, (.), id)
data Invertible a b = Invertible (a -> b) (b -> a)
instance Category Invertible where
id = Invertible Prelude.id Prelude.id
(Invertible f f') . (Invertible g g') =
Invertible (f Prelude.. g) (g' Prelude.. f')
invert (Invertible x y) = Invertible y x
Beachten Sie, dass die folgenden Bedingungen erfüllt ist:
invert (g . f) == invert f . invert g
Diese Struktur sehr ähnlich scheint ein contravariant functor (wikipedia), da sie die gleiche Axiom folgt:
F(g . f) = F(f) . F(g)
In meinem Fall F
ist einfach invert
.
ich Data.Functor.Contravariant.contramap sah, die eine Funktion des Typs hat:
(a -> b) -> f b -> f a
Aber ich wusste nicht, wie würde ich das in meiner Situation umsetzen würde. Zum Beispiel kann ich keine vernünftige Wahl für f
erarbeiten, und in meiner Situation gibt es keine Funktion a -> b
, nur invert
.
Jedoch passt invert
nichtsdestoweniger das mathematische Axiom eines kontravarianten Funktors, also denke ich, dass ich das in eine existierende Klasse einbauen kann, aber ich kann einfach nicht herausfinden, welches und wie ich es mache. Jede Hilfe oder Hinweise würden geschätzt werden.
Sie könnten diesen Blogbeitrag interessant finden: http://gelisam.blogspot.com/2013/07/the-commutative-monad.html –
Das Problem, meiner bescheidenen Meinung nach, ist, dass "invert" ein kontravarianter Endofunkortist in der Kategorie "Invertible", während "Contravariant f" ein kontravariantes Endofunctor in der Kategorie "Hask" ist. –
@AaditMShah, das war meine Vermutung, aber ich kenne nicht genug Kategorientheorie, um zuversichtlich zu sein. – dfeuer