<html><body style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-size: 12px;">This doesn't buy you very much, unfortunately. (f $!) only forces its argument if the result is ever forced. So if the implementation of fmap doesn't force the function calls (and normally it won't, with no possible way to use the result for anything) then f <$!> x doesn't either; the arguments to those calls are not forced, and so the contents of the original structure remain unforced. For example:<div><br /></div><div><br /><div>Prelude> let f <$!> x = (f $!) <$> x</div><div>(<$!>) :: Functor f => (a -> b) -> f a -> f b</div><div><br /></div><div>Prelude> let z = const True <$!> [undefined]</div><div>z :: [Bool]</div><div><br /></div><div>Prelude> case z of (_:_) -> "matched"</div><div>"matched"</div><div>it :: String</div><div><br /></div><div><div>Prelude> z</div><div>[*** Exception: Prelude.undefined</div></div><div><br /></div><div><br /></div>The undefined bomb only goes off when I start to force the elements of z; prior to that no strictness has been gained, and the list contains a thunk as normal. In particular, this version of <$!> wouldn't help with the lazy IO problem described in that stackoverflow question Christopher linked earlier.</div><div><br /></div><div>-- Ben<br /><blockquote><br />----- Original Message -----<br /><div style="width:100%;background:rgb(228,228,228);"><div style="font-weight:bold;">From:</div> "Will Yager" <will.yager@gmail.com></div><br /><div style="font-weight:bold;">To:</div>"Christopher Allen" <cma@bitemyapp.com><br /><div style="font-weight:bold;">Cc:</div>"haskell-cafe" <haskell-cafe@haskell.org><br /><div style="font-weight:bold;">Sent:</div>Mon, 10 Aug 2015 14:30:49 -0700<br /><div style="font-weight:bold;">Subject:</div>Re: [Haskell-cafe] Constraints on <$> vs <$!><br /><br /><br /><div>What about</div>
<div><br /></div>
<div>f <$!> x = (f $!) <$> x </div>
<div><br /></div>
<div>?</div>
<div><br /></div>
<div>--Will</div>
<div>
<br /><br /></div>
<div>
<br />On Aug 10, 2015, at 14:20, Christopher Allen <<a href="mailto:cma@bitemyapp.com">cma@bitemyapp.com</a>> wrote:<br /><br /></div>
<blockquote><div>
<div dir="ltr">
<a href="http://stackoverflow.com/questions/9423622/strict-fmap-using-only-functor-not-monad">http://stackoverflow.com/questions/9423622/strict-fmap-using-only-functor-not-monad</a> seems to cover it.<br /></div>
<div class="gmail_extra">
<br /><div class="gmail_quote">On Mon, Aug 10, 2015 at 4:17 PM, Alexey Egorov <span dir="ltr"><<a href="mailto:electreg@list.ru">electreg@list.ru</a>></span> wrote:<br /><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hello haskell
 ers,<br /><br />
I wonder why <$> and <$!> have different typeclass constraints?<br /><br />
(<$>) :: Functor f => (a -> b) -> f a -> f b<br />
(<$!>) :: Monad m => (a -> b) -> m a -> m b<br />
_______________________________________________<br />
Haskell-Cafe mailing list<br /><a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br /><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br /></blockquote>
</div>
<br /><br clear="all" /><div><br /></div>-- <br /><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr">Chris Allen<br /><div>
<span style="font-size:12.8000001907349px;">Currently working on </span><a href="http://haskellbook.com">http://haskellbook.com</a>
</div>
</div></div></div></div></div>
</div>
</div></blockquote>
<blockquote><div>
<span>_______________________________________________</span><br /><span>Haskell-Cafe mailing list</span><br /><span><a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a></span><br /><span><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a></span><br /></div></blockquote>



</blockquote></div></body></html>