I think monomorphism restriction is for shared evaluation.like following function<div>f xs = let len = genericLength xs in (len, len) from haskell wiki</div><div>under monomorphism the type is Num t =&gt; [b] -&gt; (t, t), if it no monomorphism restriction the type will be (Num t, Num t1) =&gt; [b] -&gt; (t, t1) which lead to twice evaluation of len. However I didn&#39;t see how the restriction effects eta reduction, when define function like f = show, g = (==) or f = \x -&gt; show x, g = \x -&gt; \y -&gt; (x==y). anyone can explain it to me? Thanks a lot.</div>