<div dir="ltr"><div>Porting some code from GHC 7.8.4 to GHC 7.10.2 and have encountered this rather odd failure:</div><div><br></div><div>    Could not deduce (MonadReader</div><div>                        (PqColumn m -> m B.ByteString)</div><div>                        (ReaderT (PqColumn m -> m B.ByteString) m))</div><div>      arising from a use of ‘ask’</div><div>    from the context (Monad m)</div><div>      bound by the type signature for</div><div>                 readFieldByteString :: Monad m =></div><div>                                        PqColumn m -> RowReader m B.ByteString</div><div>      at src/EventStore/LibPq.hs:164:24-72</div><div>    In a stmt of a 'do' block: readField <- ask</div><div>    In the expression:</div><div>      do { readField <- ask;</div><div>           lift $ readField col }</div><div>    In an equation for ‘readFieldByteString’:</div><div>        readFieldByteString col</div><div>          = do { readField <- ask;</div><div>                 lift $ readField col }</div><div><br></div><div>I wondered if it was because the environment type (PqColumn m -> m B.ByteString) itself was an instance of MonadReader and the typechecker was getting confused, so I put the environment in a newtype and it was indeed happy.</div><div><br></div><div>Unfortunately I can't share enough of this code to get the problematic fragment to compile, and my initial attempts at a small reproduction have been unsuccessful. It's something like the following, but this compiles just fine.</div><div><br></div><div>    class MyClass m where</div><div>      type MyType m</div><div>      defaultValue :: m (MyType m)</div><div>    </div><div>    l :: Monad m => MyType m -> ReaderT (MyType m -> m Int) m Int</div><div>    l n = do</div><div>      f <- ask</div><div>      lift $ f n</div><div><br></div><div>Before I put more effort into reproducing this, does anyone recognise this failure or know what might be going on here?</div><div><br></div><div>Cheers,</div><div><br></div><div>David</div></div>