<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>



Hi<BR>&nbsp;<BR>I have met a piece of code&nbsp;that cannot&nbsp;be compiled whether I add or remove the NoMonomorphismRestriction flag (as of GHC 7.0.4, Haskell platform 2011.4.0.0).<BR>I have extracted a minimal example below:<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>{-# LANGUAGE NoMonomorphismRestriction #-}<br>(f1, f2) =<br>&nbsp;&nbsp;&nbsp; let commond_definitions = undefined in<br>&nbsp;&nbsp;&nbsp; let f1 = id.show <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f2 x = (&lt; x) <br>&nbsp;&nbsp;&nbsp; in<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (f1, f2)<BR>&nbsp;<BR>I needed this format because there are many shared definitions in common_definitions for f1 and f2, and I want to keep them local.<BR>&nbsp;<BR>If I compile them with NoMonomorphismRestriction, I get:<BR><br>D:\work\test.hs:7:8:<br>&nbsp;&nbsp;&nbsp; Ambiguous type variable `a0' in the constraint:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Show a0) arising from a use of `f1'<br>&nbsp;&nbsp;&nbsp; Possible cause: the monomorphism restriction applied to the following:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f1 :: a0 -&gt; String (bound at D:\work\hsOcaml\test.hs:2:2)<br>&nbsp;&nbsp;&nbsp; Probable fix: give these definition(s) an explicit type signature<br>&nbsp;&nbsp;&nbsp; In the expression: f1<br>&nbsp;&nbsp;&nbsp; In the expression: (f1, f2)<br>&nbsp;&nbsp;&nbsp; In the expression:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f1 = id . show<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f2 x = (&lt; x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in (f1, f2)<BR>D:\work\test.hs:7:12:<br>&nbsp;&nbsp;&nbsp; Ambiguous type variable `a1' in the constraint:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Ord a1) arising from a use of `f2'<br>&nbsp;&nbsp;&nbsp; Possible cause: the monomorphism restriction applied to the following:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f2 :: a1 -&gt; a1 -&gt; Bool (bound at D:\work\hsOcaml\test.hs:2:6)<br>&nbsp;&nbsp;&nbsp; Probable fix: give these definition(s) an explicit type signature<br>&nbsp;&nbsp;&nbsp; In the expression: f2<br>&nbsp;&nbsp;&nbsp; In the expression: (f1, f2)<br>&nbsp;&nbsp;&nbsp; In the expression:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f1 = id . show<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f2 x = (&lt; x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in (f1, f2)<br>Failed, modules loaded: none.<BR>&nbsp;<BR>If I comment out&nbsp; <BR>-- {-# LANGUAGE NoMonomorphismRestriction #-}<br>I get:<BR><br>D:\work\hsOcaml\test.hs:4:17:<br>&nbsp;&nbsp;&nbsp; Ambiguous type variable `a0' in the constraint:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Show a0) arising from a use of `show'<br>&nbsp;&nbsp;&nbsp; Possible cause: the monomorphism restriction applied to the following:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f1 :: a0 -&gt; String (bound at D:\work\hsOcaml\test.hs:2:2)<br>&nbsp;&nbsp;&nbsp; Probable fix: give these definition(s) an explicit type signature<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or use -XNoMonomorphismRestriction<br>&nbsp;&nbsp;&nbsp; In the second argument of `(.)', namely `show'<br>&nbsp;&nbsp;&nbsp; In the expression: id . show<br>&nbsp;&nbsp;&nbsp; In an equation for `f1': f1 = id . show<BR>D:\work\hsOcaml\test.hs:7:12:<br>&nbsp;&nbsp;&nbsp; Ambiguous type variable `a1' in the constraint:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Ord a1) arising from a use of `f2'<br>&nbsp;&nbsp;&nbsp; Possible cause: the monomorphism restriction applied to the following:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f2 :: a1 -&gt; a1 -&gt; Bool (bound at D:\work\hsOcaml\test.hs:2:6)<br>&nbsp;&nbsp;&nbsp; Probable fix: give these definition(s) an explicit type signature<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or use -XNoMonomorphismRestriction<br>&nbsp;&nbsp;&nbsp; In the expression: f2<br>&nbsp;&nbsp;&nbsp; In the expression: (f1, f2)<br>&nbsp;&nbsp;&nbsp; In the expression:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f1 = id . show<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f2 x = (&lt; x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in (f1, f2)<br>Failed, modules loaded: none.<BR>&nbsp;<BR>Can anyone show me why this does not work and how to fix it (e.g. by adding type signature as the error message suggested)?<BR>I tried to add type signature by couldn't figure out the right way of doing it.<BR>&nbsp;<BR>Thanks&nbsp;in advance!<BR>&nbsp;<BR>Ting<BR>&nbsp;<BR>                                               </div></body>
</html>