Почему я получаю «неистовые модели в функции ...», когда я вызываю свою функцию подстроки Haskell?
-
05-10-2019 - |
Вопрос
Я работаю через книгу Haskell Road к логике, математике и программированию. Отказ (Я только в середине прохождения в главе 1, но я наслаждаюсь этим до сих пор и намереваюсь продолжать.) Я прочитал раздел 1.5 «Играю в игру Haskell», которая «состоит из ряда дополнительных примеров Познакомьтесь с [HASKELL] ». До сих пор я узнал о функциях, типах деклараций, охраняемых уравнений, немного о списке сопоставление шаблонов, а где и пусть.
Я застрял на упражнении 1.17, который просит нас написать функциональную подстроку :: 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"
Я получаю "*** Исключение: substring.hs: (3,0) - (5,45): неиспользующиеся узоры в функциональной подстроке". Я не могу понять, почему. Я не понимаю, как можно не исчерпывающие узоры, когда я использую «иначе».
Кстати, книга еще не покрыта, если они-еще. Я бы предпочел сохранить это из моего решения, пока сейчас.
Решение
У вас есть опечатка в имени функции:
subsstring xs [] = False
Из-за опечатки это объявляет новую функцию subsstring
, не случай substring
функция.
То substring
Тогда не имеет никакого случая, который будет соответствовать второму параметру []
.