<div dir="ltr"><div>Hello,</div><div><br></div><div>  Consider the following program:</div><div><br></div><div>-------------------------------------------------------------------<br></div><div>-- bar.hs</div><div><div>{-# LANGUAGE NoMonomorphismRestriction #-}</div><div><br></div><div>data Status = Foo | Bar</div><div><br></div><div>data Rec m a = Rec { </div><div>             get    :: m a</div><div>           , status :: Status</div><div>           }</div><div><br></div><div>defRec :: (Monad m) => Rec m a</div><div>defRec = undefined</div><div><br></div><div>myRec :: (Monad m) => Rec m a</div><div>myRec = Rec x y</div><div>  where</div><div>      Rec x y = defRec</div></div><div>-------------------------------------------------------------------<br></div><div><br></div><div>  It doesn't compile (under GHC 7.10.2), the error is:</div><div><br></div><div><div>bar.hs:16:7:</div><div>    No instance for (Monad t0)</div><div>    The type variable ‘t0’ is ambiguous</div><div>    When checking that ‘y’ has the inferred type</div><div>      y :: Status</div><div>    Probable cause: the inferred type is ambiguous</div><div>    In an equation for ‘myRec’:</div><div>        myRec</div><div>          = Rec x y</div><div>          where</div><div>              Rec x y = defRec</div><div>Failed, modules loaded: none.</div></div><div><br></div><div><br></div><div>  If you remove the language extension, it does.</div><div><br></div><div>  Keeping the NoMonomorphismRestriction, it can be forced to typecheck by putting in a "dummy" type that satifies the constraint when obtaining the field `status` (that doesn't depend on `m`.</div><div><br></div><div>-------------------------------------------------------------------</div><div>-- bar.hs</div><div><div>{-# LANGUAGE NoMonomorphismRestriction #-}</div><div><br></div><div>data Status = Foo | Bar</div><div><br></div><div>data Rec m a = Rec { </div><div>             get    :: m a</div><div>           , status :: Status</div><div>           }</div><div><br></div><div>defRec :: (Monad m) => Rec m a</div><div>defRec = undefined</div><div><br></div><div>myRec :: (Monad m) => Rec m a</div><div>myRec = Rec x y where<br></div><div>    s :: Rec Maybe a -> Status</div><div>    s = status</div><div>    x = get defRec</div><div>    --</div><div>    y = s defRec</div></div><div>-------------------------------------------------------------------<br></div><div><br></div><div><br></div><div>  So, what's going on here? Is this a feature of this extension? It seems like the ability to destructure and then recombine is pretty fundamental, and it shouldn't break in the way that it does. (I.e. it's kinda crazy to have to put in a dummy type satisfying the constraint; is there some way to pass down the error </div><div><br></div><div>-- <br></div><div class="gmail_signature"><div dir="ltr">Noon Silk, ن</div><div dir="ltr"><br></div><div dir="ltr"><a href="https://silky.github.io/">https://silky.github.io/</a><br><div><br>"Every morning when I wake up, I experience an exquisite joy — the joy<br>of being this signature."<br></div></div></div>
</div>