Почему я получаю "Неисчерпывающие шаблоны в функции...", когда я вызываю функцию подстроки в Haskell?
Я работаю над книгой "Дорога на Хаскелле к логике, математике и программированию". (Я только в середине главы 1, но я наслаждаюсь этим до сих пор и намерен продолжить.) Я прочитал раздел 1.5 "Игра в игру на Хаскеле", который "состоит из ряда дополнительных примеров познакомить вас с Хаскеллом ". До сих пор я узнал о функциях, объявлениях типов, охраняемых уравнениях, немного о сопоставлении шаблонов списков и о том, где и что.
Я застрял в упражнении 1.17, которое просит нас написать функцию substring:: String -> String -> Bool где:
- если xs является префиксом ys, xs является подстрокой ys
- если ys равно y:ys'и xs является подстрокой ys', xs является подстрокой ys
- ничто иное не является подстрокой ys
Я использовал функцию префикса, предоставленную в предыдущем примере:
prefix :: String -> String -> Bool
prefix [] ys = True
prefix (x:xs) [] = False
prefix (x:xs) (y:ys) = (x==y) && prefix xs ys
А потом попробовал:
substring :: String -> String -> Bool
subsstring xs [] = False
substring xs (y:ys) | prefix xs (y:ys) = True
| substring xs ys = True
| otherwise = False
... и, возможно, другие варианты этого.
Когда я бегу substring "abc" "xxxabcyyy"
я получил True
, но когда я бегу substring "abc" "xxxabyyy"
Я получаю "*** Exception: substring.hs:(3,0)-(5,45): неисчерпывающие шаблоны в подстроке функции". Я не могу понять, почему. Я не понимаю, как могут быть неисчерпывающие паттерны, когда я использую "иначе".
Кстати, книга еще не освещена, если еще. Я бы предпочел, чтобы это пока не было в моем решении.
1 ответ
У вас есть опечатка в имени функции:
subsstring xs [] = False
Из-за опечатки это объявляет новую функцию subsstring
не случай substring
функция.
substring
сама функция тогда не имеет ни одного случая, который бы соответствовал второму параметру []
,