
I have a function which, without a type annotation, types as: *Codec.ASN1.BER> :t choiceAux choiceAux :: forall (m :: * -> *) e e1. (MonadState [Maybe Encoding] m, MonadState [Maybe Encoding] (StateT [Maybe Encoding] m), MonadError e (StateT [Maybe Encoding] m), MonadError e1 m) => (TagPlicity, NamedType) -> Encoding -> m Defaulted But if I try to give it a type annotation of choiceAux :: (MonadState [Maybe Encoding] m, MonadState [Maybe Encoding] (StateT [Maybe Encoding] m), MonadError e (StateT [Maybe Encoding] m), MonadError e1 m) => (TagPlicity, NamedType) -> Encoding -> m Defaulted I get Codec/ASN1/BER.hs:66:0: Quantified type variable `e1' is unified with another quantified type variable e When trying to generalise the type inferred for `choiceAux' Signature type: forall (m :: * -> *) e e1. (MonadState [Maybe Encoding] m, MonadState [Maybe Encoding] (StateT [Maybe Encoding] m), MonadError e (StateT [Maybe Encoding] m), MonadError e1 m) => (TagPlicity, NamedType) -> Encoding -> m Defaulted Type to generalise: (TagPlicity, NamedType) -> Encoding -> m Defaulted In the type signature for `choiceAux' When generalising the type(s) for tc, choiceAux, k Changing e1 to e makes it typecheck. 1. Can anyone explain why the typechecker rejects the type it had inferred for itself? 2. I thought StateT guaranteed that the lifted monad was a state monad so why is the typechecker adding MonadState ... (StateT ... ) to the list of constraints? Ditto for MonadError ... (StateT ... )? Thanks, Dominic. PS What I thought I was going to get was choiceAux :: forall (m :: * -> *) e. (MonadError e m, MonadState [Maybe Encoding] m) => (TagPlicity, NamedType) -> Encoding -> m Defaulted and this is what I have now specified.