Да, это правда. В целом, допустимый шаблон в Haskell должен содержать только конструкторы, литералы и переменные, с которыми вы связываетесь, а не только какие-либо функции. ( Haskell / Сопоставление с образцом )
(+)
- это функция, поэтому шаблоны, содержащие ее, просто не должны быть действительными. Причина, по которой так называемый «n + k шаблон» был на самом деле вещью, заключается в том, что он был введен в качестве синтаксического сахара (см. статью Википедии о Haskell 2010 ). Кроме того, (5+5:x:xs)
как шаблон должен быть таким же недействительным, как [x, y, z] ++ xs
.
Чтобы дать мои собственные два цента, это может быть еще одной причиной, почему это не разрешено, даже если два литерала являются операндами (+)
. Haskell позволяет вам сделать это, если шаблон 5+5
должен пройти компилятор:
foo x = let 5 + 5 = 11 in (\(5+5:xs) -> x ++ xs)
Теперь уже во время компиляции ясно, что 5 + 5 = 10
?