[Haskell-beginners] help using Data.Map lookup - how to get values
after the "Just" constructor
Martin Tomko
martin.tomko at geo.uzh.ch
Tue Sep 21 09:50:46 EDT 2010
Thank you Edgar, Daniel,
these helped a lot!
one more question regarding the suggestion of daniel, using ! if I KNOW
that the key will occur (and as I work in a closed world, it should be
the case).
Out of curiosity - how does one use ! ??
let's say I have a function returning a map: myFunct a b, and I was using:
M.lookup c (myFunct a b)
On this, I could happily use fromJust (M.lookup c (myFunct a b))
Now, if I do
(myFunct a b) ! c i get ! not in scope.
! seems to come from Data.Map and I import it as
import qualified Data.Map as M
I don't think I can do M.! :))). How to go about it?
On 9/21/2010 3:34 PM, Daniel Fischer wrote:
> On Tuesday 21 September 2010 15:05:19, Martin Tomko wrote:
>
>> Dear All,
>> as a newbie, I am only just discovering some intricacies of haskell.
>> I have a Data.Map map, and am trying the lookup function to get the
>> value for a given key (it is a list in my case, btw). I am struggling to
>> get access to the value, as it is constructed using Just. I know that
>> the question is therefore more general then the application on Map, so I
>> would be glad to get a wider picture. I Checked in Real World Haskell,
>> btu did nto find and answer. In Haskell the craft of... I found the
>> following (p263):
>>
>> mapValue :: (a->b)-> Maybe a -> Maybe b
>> mapValue g (Just a) = Just (g a)
>> mapValue g Nothing = Nothing
>>
> Note: this is a special case of the more general `fmap'. If you use fmap
> instead of mapValue, a) you don't need to write the function yourself (it's
> available from the Prelude) and b) it works unchanged if you find that
> instead of Maybe, e.g. a list is more appropriate.
>
>
>> Which is fine, but it makes the Just constructor travel through the
>> whole code, which is annoying. Is there a way out? Or would that be a
>> dirty hack?
>>
> No, not a dirty hack. But you have to distinguish between the cases where
> your lookup was successful and those where it wasn't.
> Depending on the surrounding code, for example
>
> .... case Data.Map.lookup key map of
> Nothing -> stuff for absent key
> Just val -> stuff with val
>
> is a good way. If you *know* that the key you want to look up is in the
> map, you can also use (!) to get the value.
>
>
>> I do not quite understand the following discussion of maybe (p263-4),
>> but it seems like the code suggested is able to return a value at the
>> end...
>>
> maybe :: b -> (a -> b) -> Maybe a -> b
> maybe default transform valueOrNot
>
> if valueOrNot is a value (Just val), the result is (transform val), if
> valueOrNot is Nothing, the result is the default.
>
> There's a less general variant (to be imported from Data.Maybe)
>
> fromMaybe :: a -> Maybe a -> a
> fromMaybe default valueOrNot
>
> returns val in case valueOrNot is (Just val) and the default in case of
> Nothing.
>
> If you use that, you might as well directly use Data.Map.findWithDefault.
>
> These are good if there's a sensible default for absent keys, otherwise the
> won't help you either.
>
>
>> Thanks
>> Martin
>>
>
>
More information about the Beginners
mailing list