Почему я получаю "Неисчерпывающие шаблоны в функции...", когда я вызываю функцию подстроки в Haskell?

Я работаю над книгой "Дорога на Хаскелле к логике, математике и программированию". (Я только в середине главы 1, но я наслаждаюсь этим до сих пор и намерен продолжить.) Я прочитал раздел 1.5 "Игра в игру на Хаскеле", который "состоит из ряда дополнительных примеров познакомить вас с Хаскеллом ". До сих пор я узнал о функциях, объявлениях типов, охраняемых уравнениях, немного о сопоставлении шаблонов списков и о том, где и что.

Я застрял в упражнении 1.17, которое просит нас написать функцию substring:: String -> String -> Bool где:

  1. если xs является префиксом ys, xs является подстрокой ys
  2. если ys равно y:ys'и xs является подстрокой ys', xs является подстрокой ys
  3. ничто иное не является подстрокой 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 сама функция тогда не имеет ни одного случая, который бы соответствовал второму параметру [],

Другие вопросы по тегам