Jeśli zdefiniuję typ transformatora monad dla Identity
, jest on w stanie wywnioskować instancję Show
.Dlaczego nie można wyprowadzić wystąpienia instancji dla produktu MaybeT?
newtype IdentityT f a =
IdentityT { runIdentityT :: f a }
deriving (Show)
będą czerpać
instance Show (f a) => Show (IdentityT f a)
Ale jeśli określić rodzaj transformatora monada dla Maybe
newtype MaybeT m a =
MaybeT { runMaybeT :: m (Maybe a) }
deriving (Show)
pojawia się błąd
• No instance for (Show (m (Maybe a)))
arising from the first field of ‘MaybeT’ (type ‘m (Maybe a)’)
Od Maybe a
ma instancję Show
, spodziewam go do pracy i czerpać
instance Show (m (Maybe a)) => Show (MaybeT m a)
Dlaczego nie może?
Ale druga sugestia, aby włączyć "UndecidableInstances", jest całkowicie w porządku. – dfeuer
Więc mogę użyć 'UndecidableInstances', aby uzyskać kompilator do wyprowadzenia instancji dla mnie, ale co z typem' MaybeT' sprawia, że nie może on wyprowadzać bez tego, podczas gdy może obsłużyć typ 'IdentityT' po prostu w porządku? Dawny. Spodziewam się, że będzie w stanie pokazać 'MaybeT [Just 1]' bez żadnych rozszerzeń – robertjlooby