Когда вы получаете совершенно неожиданный результат, особенно с относительно простой функцией, такой, как эта, может быть полезно следовать логике вручную.Итак, давайте посмотрим, что здесь происходит:
reverse' (0:[8,2,5,6,1,20,99,91,1]) = 1 : reverse' xs ==>
1 : (reverse' (8:[2,5,6,1,20,99,91,1]) = 1 : reverse' xs ==>
1 : 1 : (reverse' (2:[5,6,1,20,99,91,1]) = 1 : reverse' xs ==>
...
Вы можете видеть, куда это идет.Проблема проста;вы просто переворачиваете неправильную часть списка в рекурсивном шаге.Вместо того, чтобы перевернуть хвост, как вы делаете сейчас, вы хотите перевернуть все, кроме последнего элемента.Таким образом, вы можете изменить его на что-то вроде этого:
reverse' :: [b] -> [b]
reverse' [] = []
reverse' [x] = [x]
reverse' xs = last xs : reverse' (init xs)
, что возвращает то, что вы ожидаете: reverse' [1,91,99,20,1,6,5,2,8,0] = [0,8,2,5,6,1,20,99,91,1]