akikaaa
akikaaa

Reputation: 11

Haskell: Pattern Syntax in expression context:_

I a fresh man in Haskell. Here is my program :

maybe_divide :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_divide a b = case (a, b) of  
 (Just a, Just b)
 | (Just a, Just b)            
 | (Nothing, _)    -> Nothing
 | (_, Just 0)     -> Nothing
 | (_, Nothing)    -> Nothing
 | (Just a,Just b) -> Just (a `div` b)

The compiler shows that: pattern syntax in expression context:_. When I just use case without guards it works. Why it doesn't work within guards?

Upvotes: 1

Views: 882

Answers (1)

DiegoNolan
DiegoNolan

Reputation: 3766

As mentioned in the post guards are not needed for pattern matching. You can remove some cases that are superfluous.

maybe_divide :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_divide a b = case (a, b) of
                    (Just _, Just 0) -> Nothing
                    (Just n, Just d) -> Just (n `div` d)
                    _ -> Nothing

But You don't have to write that function at all. Because Maybe is a Monad you can just write this.

maybeDivide :: Integer -> Integer -> Maybe Integer
maybeDivide _ 0 = Nothing
maybeDivide n d = Just (n `div` d)

And then to get your version of maybe_divide you can write this.

maybe_divide' :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_divide' a b = a >>= (\n -> b >>= (\d -> maybeDivide n d))

Which may be easier to read as this.

maybe_divide'' :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_divide'' a b = do
    n <- a
    d <- b
    maybeDivide n d 

Upvotes: 2

Related Questions