
That works with Maybe, but not with lists. If I want at least one of xs or ys to match a two element list then f xs ys | [_,_] <- xs <|> ys = ... won't behave as expected, since <|> is ++ for lists, so f [1] [2] will match the pattern. Undoubtedly there are other type- and example-specific ways to encode the alternative for lists and other examples. I think what the OP is asking though, is why pattern alternatives aren't allowed in pattern guards (or in patterns in function definitions, or in case statements). I'm guessing that the major problem is binding? Suppose the token "or" introduces pattern alternatives: g xs ys | (_:_:xrest) <- xs) or ([y1] <- ys) = ... The pattern matches if xs has at least two elements or if ys is a one element list. But after the match you don't know which names have been bound. I guess there are ways to deal with that problem, like requiring every pattern alternative to bind exactly the same set of names and types, but sounds like that would get pretty hairy. How do other languages that allow "or patterns" handle binding? Graham On 21/09/2013 9:34 AM, Daniel Trstenjak wrote:
What am I missing?
You can combine booleans by '||', but 'Just n <- x' doesn't result to a boolean.
You can use '<|>' from 'Control.Applicative' to get the desired behavoir.
f x y | Just _ <- x <|> y = 1 | otherwise = 2
Greetings, Daniel
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners