Тип списка "Тип суммы" с конструктором, что-то вроде:
data List a =
cons a (List a)
| nil
Ваш первый пример - сопоставление с шаблоном для типа данных (с синтаксическим сахаром для :
).
Ваш второй пример - это сопоставление с образцом целых чисел, которые не являются определением типа данных. Для целых чисел нет шаблона, использующего ваш синтаксис. Вы можете написать свой пример с:
foo :: Int -> String
foo 0 = "Zero"
foo n = "next number is " ++ show (n+1)
На заметку, если вы кодируете целые числа с типами данных, такими как:
data Nat = Zero | Succ Nat deriving (Show)
Тогда вы можете использовать свой шаблон, как вы хотели изначально.
foo :: Nat -> String
foo Zero = "Zero"
foo n@Succ(p) = "next number is " ++ show(n)
Здесь шаблон Succ(p)
играет роль n-1
.