[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 12:30:57 EST 2008
It was pointed out to me that there are other differences besides
monadic versus applicative, and now I'm thinking I misdiagnosed the
bug after all.
sorry for the spam.
2008/12/17 Thomas Hartman <tphyahoo at gmail.com>:
> 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