Почему я получаю «Неисчерпывающие шаблоны в функции ...», когда я вызываю функцию подстроки в Haskell? - PullRequest
10 голосов
/ 26 сентября 2010

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

Я застрял в упражнении 1.17, которое просит нас написать подстроку функции :: 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 Ответ

12 голосов
/ 26 сентября 2010

У вас есть опечатка в имени функции:

subsstring xs [] = False

Из-за опечатки объявляется новая функция subsstring, а не функция substring.

В самой функции substring нет ни одного случая, который соответствовал бы второму параметру [].

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