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> </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; &#39;p&#39;) [()]<br>f2 = map (\() -&gt; &#39;q&#39;) 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> Caf=NoCafRefs,<br> Str=DmdType m,<br> Unf=Unf{Src=&lt;vanilla&gt;, TopLvl=True, Arity=0, Value=True,<br>         ConLike=True, Cheap=True, Expandable=True,<br>         Guidance=IF_ARGS [] 1 2}]<br>
M2.f22 = GHC.Types.C# &#39;q&#39;<br><br>M2.f11 :: GHC.Types.Char<br>[GblId,<br> Caf=NoCafRefs,<br> Str=DmdType m,<br> Unf=Unf{Src=&lt;vanilla&gt;, TopLvl=True, Arity=0, Value=True,<br>         ConLike=True, Cheap=True, Expandable=True,<br>
         Guidance=IF_ARGS [] 1 2}]<br>M2.f11 = GHC.Types.C# &#39;p&#39;<br><br>M2.f21 :: () -&gt; GHC.Types.Char<br>[GblId,<br> Arity=1,<br> Caf=NoCafRefs,<br> Unf=Unf{Src=&lt;vanilla&gt;, TopLvl=True, Arity=1, Value=True,<br>
         ConLike=True, Cheap=True, Expandable=True,<br>         Guidance=ALWAYS_IF(unsat_ok=True,boring_ok=True)}]<br>M2.f21 =<br>  \ (ds_dch :: ()) -&gt; case ds_dch of _ { () -&gt; M2.f22 }<br><br>M2.f2 :: [GHC.Types.Char]<br>
[GblId,<br> Str=DmdType,<br> Unf=Unf{Src=&lt;vanilla&gt;, TopLvl=True, Arity=0, Value=False,<br>         ConLike=False, Cheap=False, Expandable=False,<br>         Guidance=IF_ARGS [] 3 0}]<br>M2.f2 =<br>  GHC.Base.map<br>
    @ () @ GHC.Types.Char M2.f21 M1.$fMyEnum()_$cmyEnum<br><br>M2.f1 :: [GHC.Types.Char]<br>[GblId,<br> Caf=NoCafRefs,<br> Str=DmdType,<br> Unf=Unf{Src=&lt;vanilla&gt;, TopLvl=True, Arity=0, Value=True,<br>         ConLike=True, Cheap=True, Expandable=True,<br>
         Guidance=IF_ARGS [] 1 3}]<br>M2.f1 =<br>  GHC.Types.:<br>    @ 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 &quot;correctly&quot;. Adding INLINE/INLINABLE pragmas to myEnum doesn&#39;t improve things either. Is this a bug, or is there a reason for this behavior?<br>
<br><br>Thanks,<br>Pedro<br>