KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I was doing the 99 Problems in Haskell when I encountered a solution to Problem 19 that I did not fully understand. The task is to write a rotate function that works like this *Main> rotate ['a','b','c','d','e','f','g','h'] 3 "defghabc" *Main> rotate ['a','b','c','d','e','f','g','h'] (-2) "ghabcdef" One provided solution is rotate [] _ = [] rotate l 0 = l rotate (x:xs) (n+1) = rotate (xs ++ [x]) n rotate l n = rotate l (length l + n) I don't understand how the pattern matching can ever reach the fourth line. It seems to have to do with the (n+1) so that when n is negative the third line does not match and therefore the fourth is taken. If that is the case why does the notation (n+1) work that way resp. isn't that arbitrary or is that a convention (in mathematics?) that I'm not aware of? Because the way I understand it is that rotate is called recursively in the third line with the argument n reduced by one. So I would think that rotate [] _ = [] rotate l 0 = l rotate (x:xs) n = rotate (xs ++ [x]) (n-1) rotate l n = rotate l (length l + n) is equivalent. However, it is not. This definition gives the following warning Warning: Pattern match(es) are overlapped In the definition of `rotate': rotate l n = ... whereas the former definition compiles just fine.
Tags (comma-separated)
Save Edits
Cancel