otherwise
находится в области действия шаблона l@(x:xs)
, который может соответствовать только непустой строке. Это может помочь увидеть, что это (эффективно) переводит внутренне:
guardMatch l = case l of
(x :xs) -> if x == '-' then "negative " ++ xs else l
patternMatch l = case l of
('-':xs) -> "negative " ++ xs
_ -> l
(На самом деле, я думаю, что if
переводится на case
+ охрану, а не наоборот).