myReverse :: [Int] -> Int -> [Int]
myReverse [] n = []
myReverse (x:xs) n
| n < 0 = x:xs
| n == 0 = (-x):xs
| otherwise = x:(myReverse xs (n-1))
Это индексирование массива от 0
; ваш пример индексов от 1
, но не указан для случая n == 0
. Зафиксировать его для индексации с 1
должно быть достаточно очевидным :)
Кроме того, ваша капитализация не соответствует действительности; MyReverse
отличается от myReverse
, и только последняя действительна как функция.
Результаты, в GHCi:
*Main> myReverse [10,20,30,40,50] 0
[-10,20,30,40,50]
*Main> myReverse [10,20,30,40,50] 2
[10,20,-30,40,50]
*Main> myReverse [10,20,30,40,50] 3
[10,20,30,-40,50]
*Main> myReverse [10,20,30,40,50] 5
[10,20,30,40,50]
*Main> myReverse [10,20,30,40,50] (-1)
[10,20,30,40,50]
Более общая версия, которая делает то же самое, используя бессмысленные определения для myReverse
:
myGeneric :: (a -> a) -> [a] -> Int -> [a]
myGeneric f [] n = []
myGeneric f (x:xs) n
| n < 0 = x:xs
| n == 0 = (f x):xs
| otherwise = x:(myGeneric f xs (n-1))
myReverse :: [Int] -> Int -> [Int]
myReverse = myGeneric negate
Это пахнет как домашнее задание. Если это так, пометьте его как таковой. –
'itemInverse' (или' inverseItem') будет лучшим именем, так как «reverse» подразумевает совершенно другую операцию над списками. – outis
или 'negateItem'. Обратное может означать 1/x. – kennytm