
Martin Huschenbett schrieb:
My thoughts were that for any class C the types
Maybe (forall a. C a => a) (I will call it T1 for short)
and
(forall a. C a => Maybe a) (I will call it T2 for short)
are isomorphic. Defining the isomorphism from T1 to T2 is quite simple:
iso1 :: Maybe (forall a. C a => a) -> (forall a. C a => Maybe a) iso1 (Just s) = Just s iso1 Nothing = Nothing
But I don't catch how to define the isomorphism of the other direction (from T2 to T1). I would guess that defining this isomorphism would also solve my problem concerning the SQL stuff.
I found the solution to my problem. I just want to post it for others who may come across the same problem. The trick was simply looking at GHC's error message that tells something about ambiguous types. So let T be an arbitrary instance of C then the other isomorphism becomes:
iso2 :: (forall a. C a => Maybe a) -> Maybe (forall a. C a => a) iso2 s if isJust (s :: Maybe T) then Just (fromJust s) else Nothing
Regards, Martin.