当您得到完全意想不到的结果时,尤其是对于像这样相对简单的函数,手动遵循逻辑会很有帮助。让我们看看这里发生了什么:
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]