特定の点の周りに多次元点のグリッドを生成するコード形式を Java do F# に移植しようとしています。私はこれを思いつきました:
let gridGenerator midpoint stepSize steps =
seq {
let n = Array.length midpoint
let direction = Array.create n -steps
let mutable lastIndex = n-1
while lastIndex>=0 do
let next = midpoint |> Array.mapi (fun i x -> x+ direction.[i]*stepSize)
while lastIndex>=0 && direction.[lastIndex]=steps do
direction.[lastIndex]<- (-steps)
lastIndex<-lastIndex-1;
if lastIndex>=0 then
direction.[lastIndex]<-direction.[lastIndex]+1;
lastIndex <- n-1;
yield next;
}
このコードが恐ろしく命令的であることに加えて (修正方法のヒントをいただければ幸いです)、コンパイル エラーが発生します。
Program.fs(18,15): エラー FS0407: 可変変数 'lastIndex' が無効な方法で使用されています。ミュータブル変数は、クロージャによってキャプチャできません。この突然変異の使用を排除するか、'ref' と '!' を介してヒープに割り当てられた可変参照セルを使用することを検討してください。
このエラーを修正するにはどうすればよいですか? より機能的にするにはどうすればよいですか?
例: midpoint [|0.0, 1.0|]
、step size0.5
およびstepsの場合、1
私が期待する (実際には任意の順序で)
seq{[|-0.5, 0.5|], [|-0.5, 1.0|], [|-0.5, 1.5|], [|0.0, 0.5|], [|0.0, 1.0|], [|0.0, 1.5|], [|0.5, 0.5|], [|0.5, 1.0|], [|0.5, 1.5|]}
これは何度も実行されるため、パフォーマンスが重要であることにも注意してください。