Powiedzmy mam następująceTypeclass dla (co wydaje się być) kontrawariantny funktor realizacji funkcji inwersji
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
Należy pamiętać, że prawdziwe są następujące:
invert (g . f) == invert f . invert g
Struktura ta wydaje się bardzo podobna do contravariant functor (wikipedia), jak wynika z tego samego aksjomat:
F(g . f) = F(f) . F(g)
w moim przypadku, F
to po prostu invert
.
Spojrzałem na Data.Functor.Contravariant.contramap, który posiada funkcję typu:
(a -> b) -> f b -> f a
Ale ja nie wiem, skąd będę realizować, że w mojej sytuacji. Na przykład nie mogę wymyślić rozsądnego wyboru dla f
, aw mojej sytuacji nie ma funkcji a -> b
, tylko invert
.
Mimo to, invert
mimo to pasuje do aksjomatu matematycznego przeciwwariantnego funktora, więc myślę, że mogę go dopasować do istniejącej klasy, ale po prostu nie mogę znaleźć tego i jak to zrobić. Każda pomoc lub wskazówki będą mile widziane.
Ten post na blogu może Cię zainteresować: http://gelisam.blogspot.com/2013/07/the-commutative-monad.html –
Problem polega, moim zdaniem, na skromnym mniemaniu, że "inwertor" jest przeciwstawnym endofunktorem w kategorii "Odwracalne" natomiast "Przeciwwariancja f" jest przeciwstawnym endofunktorem w kategorii "Hask". –
@AaditMShah, to było również moje przypuszczenie, ale nie znam wystarczającej teorii kategorii, aby być pewnym siebie. – dfeuer