在F#中,array2Ds是可变的,不能用于功能最强大的代码。目前,当我想进行更改并返回数组时,我通过执行输入的Array2D.copy来隐藏它。即
let test (x : int[,]) =
let y = Array2D.copy x
y.[0,0] <- 3
是否有更好的方法可以使测试更具功能性?
答案 0 :(得分:3)
您始终可以使用Array2D module上的高阶函数以函数样式使用Array2D
。特别是,对数组索引进行操作的Array2D.mapi适用于此任务:
let test (xs: int[,]) =
xs |> Array2D.mapi (fun i j x -> if i=0 && j=0 then 3 else x)
修改强>
一般来说,您的test
功能很好,因为您可以限制功能内部的副作用。在嵌套数组的情况下,您需要更加小心;但是,编写具有受控副作用的函数通常比使用Array2D
的高阶函数提供更好的性能。