
On Friday 29 April 2011 18:43:51, Mike Meyer wrote:
On Fri, 29 Apr 2011 03:27:48 +0200
Daniel Fischer
wrote: On Friday 29 April 2011 02:35:13, Graham Hopper wrote: Basically, a pattern is
[...]
Or
- a constructor application, (Con arg1 arg2), (x:xs), (a,b,c,d), ((:) x xs)
[...]
Also there are
[...]
I've been wondering about this case. Since : is "just another function",
It's "just another function" in the same sense as Just or Right are "just another function". They all are (non-nullary) constructors. They are "just another function" in the sense that they take arguments and produce values, and you can pass them to any higher order function like every other function (that is, if the type matches) or have them as results of other functions. They are however special functions in the sense that, as they are constructors, you can pattern-match on them (fully applied, you can't do foo :: (Char -> Either Char Int) -> Bool foo Left = True foo _ = False ).
then if things were consistent, I ought to be able to use other functions in constructor applications. But my attempts to do so always seem to result in syntax errors.
So my question is - what are the rules for constructor applications? Is the list above complete?
I think this time I haven't forgotten anything, but don't be too sure, better check the report.
Are there just a few more? Is there some rule to determine which functions are ok in patterns and which aren't?
You can match on constructor applications, nothing else, except for the few special cases, - number literals (sugar for an equality test) - character literals ('a' is not really a constructor, matching on character literals also gives rise to an equality test) - string literals ("foo") - list patterns ([x1,x2,x3]) Special syntax for convenience, reduces to ('f' : 'o' : 'o' : []) resp. (x1 : x2 : x3 : []). - tuples are constructor applications, but with special (wired-in) syntax, so those patterns don't match the normal cases of Con pat1 pat2 ... patN -- prefix constructor application pat1 :$%& pat2 -- infix constructor application - labelled patterns, Con{ field1 = pat1, ..., fieldN = patN } (N >= 0) You can tell constructors apart from "ordinary functions" by case, if the name begins with an upper-case letter, it's a constructor, if it begins with a lower-case letter or an underscore, it's an "ordinary function". For operators, the rule is the same if you regard ':' as an upper-case- symbol (and the only one); an infix operator is a constructor if and only if it starts with ':'. So, (x : xs), infix application of the operator (:), : obviously starts with ':', hence a constructor ~> valid pattern. (x && y); infix application of the operator (&&), && doesn't start with ':', no constructor ~> not a valid pattern.
Thanks,