Haskell (n + 1) в сопоставлении с образцом

Я выполнял 99 проблем в Haskell , когда я столкнулся с решением - Проблема 19 , которую я не совсем понял.

Задача состоит в том, чтобы написать функцию поворота, которая работает следующим образом

*Main> rotate ['a','b','c','d','e','f','g','h'] 3
"defghabc"

*Main> rotate ['a','b','c','d','e','f','g','h'] (-2)
"ghabcdef"

Одно из возможных решений:

rotate [] _ = []
rotate l 0 = l
rotate (x:xs) (n+1) = rotate (xs ++ [x]) n
rotate l n = rotate l (length l + n)

Я не Я понимаю, как сопоставление с образцом может дойти до четвертой строки. Похоже, это связано с (n + 1) , так что, когда n отрицательное, третья строка не совпадает, и поэтому берется четвертая. Если это так, то почему обозначение (n + 1) работает именно так, соответственно. Разве это не произвольно, или это соглашение (в математике?), о котором я не знаю?

Поскольку, как я понимаю, функция rotate вызывается рекурсивно в третьей строке с уменьшенным на единицу аргументом n . Так что я думаю, что

rotate [] _ = []
rotate l 0 = l
rotate (x:xs) n = rotate (xs ++ [x]) (n-1)
rotate l n = rotate l (length l + n)

эквивалентен. Однако это не так. Это определение дает следующее предупреждение

Warning: Pattern match(es) are overlapped
         In the definition of `rotate': rotate l n = ...

, тогда как первое определение компилируется нормально.

20
задан Eugen 6 February 2011 в 13:30
поделиться