Justin Bailey wrote:
apfelmus wrote:

Extracting the head and tail of  ss  with a let statement could lead to
  a huge unevaluated expression like

   rest = tail (tail (tail (...)))

Even though they are probably forced, would breaking the head and tail
apart via pattern-matching or a case statement avoid building up that
unevaluated expression?

Yes, absolutely, since pattern matching has to force the scrutinee in order to choose the matching case. In contrast, a let statement

  let (x:xs) = expr in ...

simply assumes that expr is of the form (x:xs) but does not force it and check whether that's really the case. Of course, this may turn out as pattern match later on as soon as x is demanded but expr was initially the empty list.

In your case, the test null ss forces ss and checks whether the let-pattern is ok. So, you basically end up doing what a case expression would do. In other words, the situation is more "they are most likely forced" than "they are probably forced" and it's just a matter of convenience to choose one over the other.

But there are certain situations where you can check/prove differently that the let pattern never fails and where such a lazy pattern is wanted.

Regards,
apfelmus

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to