Более функциональная альтернатива array2D в F # - PullRequest
1 голос
/ 19 марта 2012

В F # array2D являются изменяемыми, что не делает для наиболее функционального кода.В данный момент я скрываю это, делая Array2D.copy своих входных данных, когда я хочу внести изменения и вернуть массив.т.е.

let test (x : int[,]) =
    let y = Array2D.copy x
    y.[0,0] <- 3

Есть ли лучший подход, который делает тест более функциональным?

1 Ответ

3 голосов
/ 19 марта 2012

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

let test (xs: int[,]) =
   xs |> Array2D.mapi (fun i j x -> if i=0 && j=0 then 3 else x) 

EDIT:

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

...