[Haskell-cafe] Re: monadic versus aplicative style. These two snips
seem to do the same thing yet one has a bug.
tphyahoo at gmail.com
Wed Dec 17 11:57:53 EST 2008
The commented-out signature is incorrect.
Of course, the two functions have the same type sig.
2008/12/17 Thomas Hartman <tphyahoo at gmail.com>:
> I rewrote a piece of code that used applicative to use instead
> monadic style, basically because I wanted to adapt it for my own
> purposes but hadn't wrapped my head around applicative yet.
> Unfortunately my rewrite had a bug, which I'm still not completely
> clear on. (I am guessing it's a laziness mixed with IO issue.)
> I discarded my own version and am using the original now of course,
> but I'm curious if anyone has anything to say on the difference
> between these two bits of code and, in general if there is any way to
> "think" about the difference between monadic and applicative.
> For what it's worth, the code comes from HSTringTemplate (on
> hackage). The bug is described in
> Basically, in happs, this bit of code caused an unrelated handler to
> not fully pages correctly, where there was more than one image to
> load. It took forever to diagnose and track this down. Ugh.
> Thanks, thomas.
> -- incorrect behavior
> directoryGroup' :: (FilePath -> FilePath -> IO (StringTemplate a)) ->
> FilePath -> IO (STGroup a)
> directoryGroup' templatereader path = do
> fs <- return . ( filter ((".st" ==) . takeExtension) ) =<<
> getDirectoryContents path
> templates <- mapM (templatereader path) fs
> stmapping <- return $ zip fs templates
> return $ groupStringTemplates stmapping
> -- correct behavior
> --directoryGroup2' :: (Stringable a) => FilePath -> IO (STGroup a)
> directoryGroup'2 templatereader path = groupStringTemplates <$>
> (fmap <$> zip . (map dropExtension)
> <*> mapM ( templatereader path )
> =<< filter ((".st" ==) . takeExtension)
> <$> getDirectoryContents path)
More information about the Haskell-Cafe