В Haskell в отличие от, например, Wolfram Mathematica в перечне образцов в рамках одного случая каждая переменная может быть использована только единожды.
На самом деле образцы являются краткой формой записи системы проекций для произведений-типов и разбора случаев для сумм-типов.
Например,
substitute x y [] = ...
substitute x y (h:hs) = ...
является краткой формой записи (кстати, "упрощенный" Хаскель, к которому ghc приводит код перед компиляцией, как раз такое представление использует)
substitute x y z = case z of
[] -> ...
(h:hs) -> ...
или, если
гиперболизировать,
substitute x y z = if null z then ... else let h = head z; hs = tail z in ...
Основная мысль: все переменные в образцах принципиально обязаны быть разными в общем случае.
Например, как быть с
func x x = ...
, когда
x :: a -> b
?
Исключение есть всего одно: когда тип обеих переменных имплементирует Eq. Но современный Haskell этого ещё не умеет. Возможно, в будущем такая фишка будет добавлена как одно из многочисленных расширений языка.