Разбор ошибки в шаблоне в объявлении foo (5 + 5: x: xs) = x - PullRequest
0 голосов
/ 14 мая 2018

Код работает должным образом, если я заменю 5 + 5 на 10. В чем здесь проблема?Могу ли я использовать оператор + внутри шаблона?Считается ли это паттерном n + k?Я знаю, что они не разрешены на Haskell 2010, так что это может быть проблемой.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

В соответствии с 3.17.1 в https://www.haskell.org/definition/haskell98-report.pdf, синтаксис шаблона допускает только var + integer, поэтому 5+5 также не должно быть допустимым шаблоном в Haskell 98.

0 голосов
/ 14 мая 2018

Да, это правда. В целом, допустимый шаблон в 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?

...