
On Friday 07 December 2001 3:09 pm, Simon Marlow wrote:
The second is.. If, following pattern matching, the matched pattern appears in an expression, is it shared or duplicated.. e.g. (a:as) -> f (a:as) Maybe I should write something like this.. x@(a:as) -> f x (I know that sometimes the type checker won't allow you to do this)
Yes, GHC will common these up (with -O). I'm not sure I understand the point about the type checker not letting you do this yourself, though: surely x and (a:as) have the same type?
In this particular case they do, but sometimes this isn't so. IE in.. case <expression1> x@<pattern> -> <expression2> the x has the same type as <expression1>, which isn't necessarily the same as would be inferred using.. x=<pattern> (here the pattern is really an expression of course) A long long time ago I griped about this in a thread the main haskell.org mailing list (called "Pattern match success changes types" IIRC). IMHO variables bound using 'as patterns' like.. x@<pattern> -> <expression> should be re-typed as if they had been written.. <pattern> -> let x=<pattern> in <expression> in order to make sharing possible. I don't think anybody agrees with me though :-) Regards -- Adrian Hey