Here is another example: > f1 n ~(x:xs) = (n, x) > f2 n (x:xs) = (n,x)
f1 5 [] = (5, error "irrefutable pattern match failure") f2 5 [] = error "pattern match failure" In particular: fst (f1 5 []) = 5 fst (f2 5 []) = error "pattern match failure" The "~" delays the pattern match until evaluation of the variables inside the pattern is demanded. If the variable is never demanded, the pattern match doesn't happen. It's especially useful for single-constructor datatypes (like pairs) if you want the code to be more lazy. -- ryan On Wed, Aug 27, 2008 at 11:56 AM, Neil Mitchell <[EMAIL PROTECTED]> wrote: > Hi > >> At the same place, I found that example, >> but wasn't wise enough to figure out >> what it does: >> >> (f *** g) ~(x,y) = (f x, g y) >> >> Can you help me understand it? > > It means exactly the same as: > > (f *** g) xy = (f (fst xy), g (snd xy)) > > i.e. if you call (f *** g) undefined, you will get (f undefined, g > undefined). If the pattern was strict (i.e. no ~) you would get > undefined. > > Please update the keyword wiki so it makes sense to you, after you > have got your head round it. > > Thanks > > Neil > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe