I'm working my way through the book The Haskell Road to Logic, Maths and Programming. (I'm only mid-way through chapter 1, but I'm enjoying it so far and intend to continue.) I've read through the section 1.5 "Playing the Haskell Game" which "consists of a number of further examples to get you acquainted with [Haskell]". So far I've learned about functions, type declarations, guarded equations, a little about list pattern matching, and where & let.
I'm stuck on exercise 1.17, which asks us to write a function substring :: String -> String -> Bool where:
I used the prefix function provided in a previous example:
prefix :: String -> String -> Bool
prefix [] ys = True
prefix (x:xs) [] = False
prefix (x:xs) (y:ys) = (x==y) && prefix xs ys
And then tried:
substring :: String -> String -> Bool
subsstring xs [] = False
substring xs (y:ys) | prefix xs (y:ys) = True
| substring xs ys = True
| otherwise = False
...and may other permutations of this.
When I run substring "abc" "xxxabcyyy"
I get True
, but when I run substring "abc" "xxxabyyy"
I get "*** Exception: substring.hs:(3,0)-(5,45): Non-exhaustive patterns in function substring". I can't figure out why. I don't understand how there could be non-exhaustive patterns when I use "otherwise".
BTW, the book has not yet covered if-then-else. I'd prefer to keep that out of my solution, for now.
You have a typo in the function name:
subsstring xs [] = False
Because of the typo this declares a new function subsstring
, not a case of the substring
function.
The substring
function itself then doesn't have any case that would match a second parameter of []
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With