此 pdf的练习 2内容如下:
一旦我们以正确的顺序获得数字,我们需要每隔一个加倍。定义一个函数
doubleEveryOther :: [Integer] -> [Integer]
请记住,doubleEveryOther 应该从右边开始每隔一个数字加倍,也就是说,倒数第二个、倒数第四个、... 的数字都加倍。
我创建了一个实现,但它没有做我期望的事情。这是我的代码:
doubleEveryOther'' :: [Integer] -> [Integer]
doubleEveryOther'' [] = []
doubleEveryOther'' [x] = [x]
doubleEveryOther'' s@(_:_:_) =
let x:y:xs = reverse s
in reverse (x : 2 * y : doubleEveryOther'' xs)
以及它运行的一些示例:
*Main> doubleEveryOther'' [1,2,3,4,5,6,7,8,9]
[1,4,3,8,5,12,7,16,9]
*Main> doubleEveryOther'' [1,2,3,4,5,6,7,8]
[1,4,3,8,10,6,14,8]
然而,我预计
*Main> doubleEveryOther'' [1,2,3,4,5,6,7,8,9]
[1,4,3,8,5,12,7,16,9]
*Main> doubleEveryOther'' [1,2,3,4,5,6,7,8]
[2,2,6,4,10,6,14,8]
您会看到,在条目数量为偶数的情况下,它会部分地通过序列发生故障。我的猜测是我没有正确处理列表项的结尾,[]
或者我没有正确使用 as-pattern。