функция сгиба продолжайте переключать различные локации - PullRequest
1 голос
/ 06 мая 2019

Я хочу написать функцию, которая принимает список целых чисел и возвращает список, где каждый элемент отрицательный.

negate :: [Int] -> [Int]
negate xs = foldl (\x xs -> (abs x * (-1)) : xs) [] xs

Эта функция отменяет все объекты массива, но также меняет месторасположение всех переменных вмассив.Что заставляет эту функцию изменять месторасположение?

1 Ответ

5 голосов
/ 06 мая 2019

foldl делает!foldl - это левый фолд, поэтому он работает с вашим списком, начиная с его начального состояния (которое вы предоставляете как []) и самого левого элемента списка, и вызывает вашу функцию, которая добавляет отрицание этого элемента кгосударство.Затем он берет следующий левый элемент и делает то же самое.Но каждый раз вы добавляете символы, что означает, что первый элемент вашего ввода в конечном итоге соответствует последнему элементу вывода, потому что он был первым, к которому был добавлен префикс.

Возможно, вы захотите foldr дляэто складка, которая начинается с самого правого элемента.В качестве альтернативы, использование map было бы более простым подходом для этой конкретной проблемы.

Пример кода:

makeAllNegative = map (negate . abs)
...