
On Saturday 20 October 2001 3:58 am, Saswat Anand wrote:
Hi, I am wondering why this function should not work with input [x,y] (list with two elements) too, since third element is not referenced. Why is it so eager to pattern match.
fun = \list -> let [a,b,c] = list in [a,b]
Thanks, Saswat
Interesting. I always thought pattern matching was lazy, but it seems it's not quite as lazy as I thought. With GHC.. main = let [a,b,c] = "Hello" in putStrLn [a,b] fails with a message about irrefutable patterns, but this seems wrong to me because in order to determine this the program has done more reductions than are necessary to determine values of a and b. Putting a ~ in front of the pattern makes no difference. But the apparently equivalent form.. main = let (a:as) = "Hello" (b:bs) = as [c] = bs in putStrLn [a,b] succeeds. ?? Mind you, now I've re-read the stuff in the Haskell 98 report about this I'm not at all sure I understand it properly. Has the language changed in this respect? I seem to remember a more comprehensible explanation of refutable and irrefutable patterns and the effect of ~ in previous versions. Regards -- Adrian Hey