Ahhh, thank you. The following works:

    let meal = either (error "Mongoed") (>>= fromBson) eres


On Thu, Jan 24, 2013 at 4:24 PM, Kim-Ee Yeoh <ky3@atamo.com> wrote:
On Thu, Jan 24, 2013 at 9:56 PM, Simon Peter Nicholls <simon@mintsource.org> wrote:
I'd like to convert this Maybe Document to a Maybe MyType without unpacking and repacking the Maybe. Is this possible?

That would be exactly 

fmap :: (Document -> MyType) -> (Maybe Document -> Maybe MyType)

where I've instantiated the type variables for your use case.
 
The fromBson function, that converts from a Document to an end user type, confuses me due to it's type:

    fromBson :: Monad m => Document -> m a

All the small, single letters are type variables. Because they are implicitly universally quantified; you, the caller, gets to specify what you want them to be. Written out in full, it's actually

fromBson :: forall (m :: * -> *), a. Monad m => Document -> m a

Here, again specializing for your use case, fromBson probably needs to be of type

fromBson :: Document -> Maybe MyType

So if you have a rightEres :: Maybe Document

then

fmap fromBson rightEres :: Maybe (Maybe MyType)

which you could then

join $ fmap fromBson rightEres :: Maybe MyType

What you're really after is the more idiomatic

rightEres >>= fromBson :: Maybe MyType

HTH,
-- Kim-Ee


 

Thanks,
Si


_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners