[Haskell-cafe] Applicative and Monad transformers
Jeremy Shaw
jeremy at n-heptane.com
Thu Aug 27 21:49:21 EDT 2009
At Fri, 28 Aug 2009 01:01:09 +0100,
> I don't entirely follow what the OP's up to, so you may have a point, but it's
> far from clear. You're talking about the reader monad, whereas he's talking
> about the effects in the ReaderT-transformed monad.
oops. Apparently I forgot to explictly state the issue :)
I am using ReaderT to lookup symbols in an environment. I am using the
inner monad/applicative functor to record whether the lookup failed or
succeeded. So I essential have the type:
> ReaderT [(a,b)] (Either [a]) b
[(a,b)] is the environment. In the end I get back a value:
Either [a] b
where [a] is all the symbols that weren't found or 'b' is the final
value. For example, if I have:
looker :: ReaderT [(String, Int)] (Either [String]) (Int, Int, Int)
looker = ((,,) <$> look "foo" <*> look "bar" <*> look "baz")
and none of the symbols are in the enviroment then I should get:
Left ["foo", "bar", "baz"]
The issue is that if I use the free (?) applicative functor instance
for ReaderT then I only get back the *first* failure:
Left ["foo"]
But, if I used my alternative definition, then I get back all the
failures. My concern is that my alternative version was somehow
violating an applicative functor law. My secondary concern was the
free version was somehow violating a law.
It seems though, that both are valid...
- jeremy
More information about the Haskell-Cafe
mailing list