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