Если вы беспокоитесь о производительности, важно помнить, что F # по умолчанию ничего не изменяет. Это требует копирования во многих наивных реализациях алгоритмов, таких как описанный вами.
РЕДАКТИРОВАТЬ: я понятия не имею, почему, но простые тесты следующего кода дают худшие результаты для Array.map
. Обязательно профилируйте любой алгоритм, который вы пробуете при выполнении такого рода оптимизаций. Однако я получил очень похожие результаты между for
и map
.
Array.map
создает новый массив для результата операции, вместо этого вы хотите Array.iteri
.
rgbPixels |> Array.iteri (fun i x -> rgbPixels.[i] <- x + 10uy)
Обратите внимание, что это может быть заключено в вашем собственном модуле, как показано ниже
module ArrayM =
let map f a = a |> Array.iteri (fun i x -> a.[i] <- f x)
К сожалению, это неизбежное зло, поскольку один из основных принципов функционального программирования - придерживаться неизменных объектов настолько, насколько позволяет ваш алгоритм, а затем, когда он будет завершен, перейти к мутации, когда производительность критична. Если вы знаете, что ваша производительность важна с самого начала, вам нужно начать с такого рода помощников.
Также обратите внимание, что, вероятно, есть библиотека, которая предоставляет эту функцию, я просто не знаю об этом из рук в руки.