Я делал 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)
работает именно так? Разве это не произвольно или это соглашение (в математике?), о котором я не знаю?
Потому что, насколько я понимаю, вращение вызывается рекурсивно в третьей строке с аргументом 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 = ...
тогда как предыдущее определение прекрасно компилируется.