<p dir="ltr">I think it's an interesting idea from a safety standpoint. Unfortunately, as Ed pointed out to me in a similar context, `void` isn't always free.</p>
<div class="gmail_quote">On Mar 31, 2016 7:22 PM, "Erik de Castro Lopo" <<a href="mailto:mle%2Bhs@mega-nerd.com">mle+hs@mega-nerd.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<br>
<br>
I was recently faced with some unexpected behaviour from a piece of<br>
code that type checks and has zero warnings (even with -Wall). The<br>
code is below (and depends on the hashtables package).<br>
<br>
The error was using the <$> operator instead of the =<< operator.<br>
Using the former, it just builds up a list of IO actions that never<br>
get run.<br>
<br>
As pointed out to me on IRC (thanks pjdeport), chaning the type<br>
signature of `forM_` to<br>
<br>
    forM_' :: (Monad m, Foldable t) => t a -> (a -> m ()) -> m ()<br>
<br>
would have resulted in an error.<br>
<br>
Yes, this change would break existing code (breaking code would require<br>
an explicit `void $` inside the `forM_`) but does anyone else think<br>
this is a good idea?<br>
<br>
Erik<br>
<br>
<br>
<br>
import Control.Monad<br>
<br>
import qualified <a href="http://Data.HashTable.IO" rel="noreferrer" target="_blank">Data.HashTable.IO</a> as HT<br>
<br>
type EvenCache = HT.BasicHashTable Int Bool<br>
<br>
main :: IO ()<br>
main = do<br>
    ht <- buildTable<br>
    xs <- HT.toList ht<br>
    putStrLn $ "cache: length " ++ show (length xs)<br>
<br>
buildTable :: IO EvenCache<br>
buildTable = do<br>
    ht <- HT.new<br>
    forM_ pairs $ \ (k,v) -><br>
        maybe (HT.insert ht k v) (const $ abort k) <$> HT.lookup ht k<br>
    return ht<br>
  where<br>
    xs = [1 .. 10] :: [Int]<br>
    pairs = map (\ i -> (i, even i)) xs<br>
    abort k = error $ "cache: duplicate key " ++ show k ++ "."<br>
<br>
<br>
--<br>
----------------------------------------------------------------------<br>
Erik de Castro Lopo<br>
<a href="http://www.mega-nerd.com/" rel="noreferrer" target="_blank">http://www.mega-nerd.com/</a><br>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
</blockquote></div>