[Haskell-cafe] Re: what does @ mean?.....
Achim Schneider
barsoap at web.de
Fri Dec 28 11:19:37 EST 2007
Ben Franksen <ben.franksen at online.de> wrote:
> Achim Schneider wrote:
>
>> ChrisK <haskell at list.mightyreason.com> wrote:
>>
>>> zeroNothing Nothing = Nothing
>>> zeroNothing (Just n) =
>>> if n == 0 then Nothing else (Just n)
>>>
>>> versus
>>>
>>> zeroNothing Nothing = Nothing
>>> zeroNothing x@(Just n) =
>>> if n == 0 then Nothing else x
>>>
>> versus
>>
>> zeroNothing Nothing = Nothing
>> zeroNothing x =
>> let (Just n) = x
>> in if n == 0 then Nothing else x
>>
>> so, @ is kind of like a let, just with its arguments flipped.
>
> However, if x@(Just n) fails to match, the next clause is chosen,
> whereas the variable pattern x matches always. Thus, the last
> version works only because the other possible case (Nothing) has
> already been handled. IOW, in the second version of zeroNothing you
> may swap the order of patterns, but not in the third one.
>
Actually, I considered working it out to
nothingIf :: (a -> Bool) -> Maybe a -> Maybe a
nothingIf f m = m >>= (\j -> if f j then Nothing else Just j)
nothingIf' :: (a -> Bool) -> Maybe a -> Maybe a
nothingIf' f m = m >>= (\j -> if f j then Nothing else m)
zeroNothing = nothingIf (== 0)
zeroNothing' = nothingIf' (== 0)
, but was too lazy. Hopefully only because it completely messes up my
point.
OTOH,
zeroIf :: MonadPlus m => (a -> Bool) -> m a -> m a
zeroIf f m = m >>= (\nz -> if f nz then mzero else m)
zeroZero :: (MonadPlus m, Num a) => m a -> m a
zeroZero = zeroIf (==0)
makes it interesting again as you can't construct a Just value with it.
More information about the Haskell-Cafe
mailing list