Отсутствует шаблон в функции вставки

У меня есть эта функция inserts где

inserts 1 [2,3] = [[1,2,3],[2,1,3],[2,3,1]]

вот определение (прямо из Algorithm Design with Haskell by Bird and Gibbons)

inserts :: a -> [a] -> [[a]]
inserts x [] = [[x]]
inserts x (y:ys) = (x:y:ys) : map (y:) (inserts x ys)

Я пробовал это в ghci с приведенным выше примером, но получаю следующее исключение

[[1,2,3],[2,1,3]*** Exception: <interactive>:2:1-53: Non-exhaustive patterns in function inserts

Кто-нибудь знает, что является недостающим шаблоном?


person JaviRdrgz    schedule 01.02.2021    source источник
comment
См. stackoverflow.com/questions/2846050/   -  person SergeyKuz1001    schedule 01.02.2021
comment
вставляет n = zipWith (\xs ys -> xs ‹› (n:ys)) ‹$› inits ‹*› хвосты   -  person xgrommx    schedule 01.02.2021
comment
кроме того, этот ответ относится к теме (а не к ошибке). (отказ от ответственности, это написано мной).   -  person Will Ness    schedule 02.02.2021


Ответы (1)


Когда я определяю inserts в соответствии с вашим кодом, а затем запускаю inserts 1 [2,3], я не получаю никаких ошибок, и возвращается правильный результат. Однако я могу повторить ошибку, когда делаю это:

Prelude> inserts x [] = [[x]]
Prelude> inserts x (y:ys) = (x:y:ys) : map (y:) (inserts x ys)
Prelude>
Prelude> inserts 1 [2,3]
[[1,2,3],[2,1,3]*** Exception: <interactive>:2:1-53: Non-exhaustive patterns in function inserts

Так что проблема не в вашей функции. Скорее вы вводите его в GHCI неправильно. Когда вы вводите многострочную функцию в GHCi таким образом, она вместо одной определяет две функции: сначала она определяет inserts x [] = [[x]], а затем перезаписывает это определение на inserts x (y:ys) = (x:y:ys) : map (y:) (inserts x ys). Вместо этого правильный метод ввода многострочной функции в GHCi состоит в том, чтобы окружить определение :{ :}:

Prelude> :{
Prelude| inserts :: a -> [a] -> [[a]]
Prelude| inserts x [] = [[x]]
Prelude| inserts x (y:ys) = (x:y:ys) : map (y:) (inserts x ys)
Prelude| :}
Prelude> inserts 1 [2,3]
[[1,2,3],[2,1,3],[2,3,1]]
person bradrn    schedule 01.02.2021