Martin Hofmann wrote:

> I often come across the problem to insert into a collection which might

> not exist yet, or delete from it and want the collection to be deleted

> if it is empty afterwards.

>

> I always end up with these two functions:

>

>

> deleteM :: (Ord a) => a -> Maybe (Set a) -> Maybe (Set a)

> deleteM e s =

> liftM (S.delete e) s >>= \s' ->

> if S.null s' then return s' else Nothing

>

> insertM :: (Ord a) => a -> Maybe (Set a) -> Maybe (Set a)

> insertM e s =

> case s of

> (Just s') -> return $ S.insert e s'

> Nothing -> return $ S.insert S.empty

>

> Is there a way to express each in a (polymorphic) point-free one-liner?

> If not, why isn't there such a function for the standard collection,

> because IMHO this is what you need when using 'alter'.

Yes, there is a way. :)

deleteM e = (\s -> if S.null s then Just s else Nothing) . S.delete e

insertM e = Just . S.insert e . maybe S.empty id

The maybe function is from Data.Maybe .

I did wonder why you want to delete the empty set, but now I see that

you need it for alter .

Regards,

apfelmus

--

http://apfelmus.nfshost.com