<html><body bgcolor="#FFFFFF"><div>Have you tried adding another (dummy) method to the class? GHC used to have problems with optimising single-method classes in the past.</div><div><br></div><div>Roman<br><br>On 18 Jan 2011, at 10:33, José Pedro Magalhães &lt;<a href="mailto:jpm@cs.uu.nl">jpm@cs.uu.nl</a>&gt; wrote:<br><br></div><div></div><blockquote type="cite"><div>Hello all,<br><br>I fail to understand the behavior of the inliner in the following example:<br><br><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex; font-family: courier new,monospace;" class="gmail_quote">
module M1 where<br><br>class MyEnum a where myEnum :: [a]<br><br>instance MyEnum () where myEnum = [()]<br></blockquote><div>&nbsp;</div><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex; font-family: courier new,monospace;" class="gmail_quote">
module M2 where<br><br>import M1<br><br>f1 = map (\() -&gt; 'p') [()]<br>f2 = map (\() -&gt; 'q') myEnum<br></blockquote><br>The generated core code for M2 with ghc-7.0.1 -O is:<br><br><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex; font-family: courier new,monospace;" class="gmail_quote">
M2.f22 :: GHC.Types.Char<br>[GblId,<br>&nbsp;Caf=NoCafRefs,<br>&nbsp;Str=DmdType m,<br>&nbsp;Unf=Unf{Src=&lt;vanilla&gt;, TopLvl=True, Arity=0, Value=True,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConLike=True, Cheap=True, Expandable=True,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Guidance=IF_ARGS [] 1 2}]<br>
M2.f22 = GHC.Types.C# 'q'<br><br>M2.f11 :: GHC.Types.Char<br>[GblId,<br>&nbsp;Caf=NoCafRefs,<br>&nbsp;Str=DmdType m,<br>&nbsp;Unf=Unf{Src=&lt;vanilla&gt;, TopLvl=True, Arity=0, Value=True,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConLike=True, Cheap=True, Expandable=True,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Guidance=IF_ARGS [] 1 2}]<br>M2.f11 = GHC.Types.C# 'p'<br><br>M2.f21 :: () -&gt; GHC.Types.Char<br>[GblId,<br>&nbsp;Arity=1,<br>&nbsp;Caf=NoCafRefs,<br>&nbsp;Unf=Unf{Src=&lt;vanilla&gt;, TopLvl=True, Arity=1, Value=True,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConLike=True, Cheap=True, Expandable=True,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Guidance=ALWAYS_IF(unsat_ok=True,boring_ok=True)}]<br>M2.f21 =<br>&nbsp; \ (ds_dch :: ()) -&gt; case ds_dch of _ { () -&gt; M2.f22 }<br><br>M2.f2 :: [GHC.Types.Char]<br>
[GblId,<br>&nbsp;Str=DmdType,<br>&nbsp;Unf=Unf{Src=&lt;vanilla&gt;, TopLvl=True, Arity=0, Value=False,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConLike=False, Cheap=False, Expandable=False,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Guidance=IF_ARGS [] 3 0}]<br>M2.f2 =<br>&nbsp; GHC.Base.map<br>
&nbsp;&nbsp;&nbsp; @ () @ GHC.Types.Char M2.f21 M1.$fMyEnum()_$cmyEnum<br><br>M2.f1 :: [GHC.Types.Char]<br>[GblId,<br>&nbsp;Caf=NoCafRefs,<br>&nbsp;Str=DmdType,<br>&nbsp;Unf=Unf{Src=&lt;vanilla&gt;, TopLvl=True, Arity=0, Value=True,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConLike=True, Cheap=True, Expandable=True,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Guidance=IF_ARGS [] 1 3}]<br>M2.f1 =<br>&nbsp; GHC.Types.:<br>&nbsp;&nbsp;&nbsp; @ GHC.Types.Char M2.f11 (GHC.Types.[] @ GHC.Types.Char)<br></blockquote><br>So, why does the inliner fail to get rid of the map in f2, while correctly ditching it in f1? Note that using two modules is essential here: if the instance is in M2 (and thus becoming orphan), the inliner works "correctly". Adding INLINE/INLINABLE pragmas to myEnum doesn't improve things either. Is this a bug, or is there a reason for this behavior?<br>
<br><br>Thanks,<br>Pedro<br>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Glasgow-haskell-users mailing list</span><br><span><a href="mailto:Glasgow-haskell-users@haskell.org">Glasgow-haskell-users@haskell.org</a></span><br><span><a href="http://www.haskell.org/mailman/listinfo/glasgow-haskell-users">http://www.haskell.org/mailman/listinfo/glasgow-haskell-users</a></span><br></div></blockquote></body></html>