Что означает "(_: _: _)" в Haskell (неисчерпывающая ошибка сопоставления с образцом из GHCI)? - PullRequest
0 голосов
/ 06 февраля 2019

Я получаю следующую ошибку от GHCI при запуске моей программы на Haskell:

"Pattern match(es) are non-exhaustive
 In an equation for `recaList': Patterns not matched: (_:_:_)"

Я искал в Интернете / SO, но не могу найти объяснение для чего (_:_:_) есть.Мое предположение было бы просто пустым списком, но я учел это в своей функции.

Не уверен, что это актуально, но вот моя программа:

recaList :: [Int] -> [Int]
recaList [] = []
recaList [x] = map recaMan [x]

Я думаю, что проблемапросто я понятия не имею, что такое (_:_:_).

1 Ответ

0 голосов
/ 06 февраля 2019
recaList :: [Int] -> [Int]
recaList [] = []
recaList [x] = map recaMan [x]

Это совпадает с пустыми списками и списками, содержащими один элемент.Вам не удалось сопоставить ни один список, содержащий два или более элементов.Я полагаю, что вы имели в виду

recaList :: [Int] -> [Int]
recaList [] = []
recaList xs = map recaMan xs

Нет необходимости в скобках.Однако map вернет пустой список, если он будет задан в качестве входных данных, поэтому ваш первый случай также не нужен.Хотя приведенный выше фрагмент кода будет работать, он будет более идиоматическим.

recaList :: [Int] -> [Int]
recaList xs = map recaMan xs

Что касается вашего вопроса о том, что означает синтаксис ошибки, : - оператор построения списка, поэтому (x:xs) соответствует любому непустому списку, привязывая первый элемент к x, а остальные к xs.(x:y:ys) делает то же самое, но первое связывается с x, второе с y, а остальное с ys.Подчеркивание просто указывает на игнорируемое значение, поэтому (_:_:_) соответствует любому списку, по крайней мере, из двух элементов.Компилятор сообщает вам, что вы не смогли сопоставить этот случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...