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

StackOverflow https://stackoverflow.com/questions/3799359

  •  05-10-2019
  •  | 
  •  

Вопрос

Я работаю через книгу Haskell Road к логике, математике и программированию. Отказ (Я только в середине прохождения в главе 1, но я наслаждаюсь этим до сих пор и намереваюсь продолжать.) Я прочитал раздел 1.5 «Играю в игру Haskell», которая «состоит из ряда дополнительных примеров Познакомьтесь с [HASKELL] ». До сих пор я узнал о функциях, типах деклараций, охраняемых уравнений, немного о списке сопоставление шаблонов, а где и пусть.

Я застрял на упражнении 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" Я получаю "*** Исключение: substring.hs: (3,0) - (5,45): неиспользующиеся узоры в функциональной подстроке". Я не могу понять, почему. Я не понимаю, как можно не исчерпывающие узоры, когда я использую «иначе».

Кстати, книга еще не покрыта, если они-еще. Я бы предпочел сохранить это из моего решения, пока сейчас.

Это было полезно?

Решение

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

subsstring xs [] = False

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top