Этот вопрос относится к этой предыдущей теме .
Я последовал совету Томаса, используя этот код, и все отлично работает:
let GetSameColorNeighs (grid:Option<Ball>[,], row, col, color:Color) =
let rec loop (row, col) = seq {
if not (row < 0 || col < 0 || row > MaxLineNumber - 1
|| col > BallsPerLine - 1) then
let ball = grid.[row,col]
match ball with
| Some(ball) ->
if (!ball.visited = false || not <| ball.color.Equals(color)) then
// Not sure what you want here - yield items using 'yield'?
// [row , col]
else
ball.visited := true
yield row, col // Add single item to results
yield! loop(row + 1, col + 1) // Add all generated to results
yield! loop(row - 1, col - 1) // -- || --
| None -> () }
loop(row, col) |> Seq.toList
Приведенный выше код перебирает массив 2d «шаров» и возвращает список индексов соседних шаров с одинаковым цветом.
Теперь мне нужно изменить функцию так, чтобы она возвращала также логическое значение, указывающее, удовлетворяет ли хотя бы один шар из списка определенному условию. Я изменил код таким образом, но кажется, что не могу присвоить изменяемое значение внутри этого кода:
let GetSameColorNeighs (grid:Option<Ball>[,], row, col, color:Color) : List<int * int> * bool =
let mutable b : bool = false
let rec loop (row, col) = seq {
if not (row < 0 || col < 0 || row > MaxLineNumber - 1
|| col > BallsPerLine - 1) then
let ball = grid.[row,col]
match ball with
| Some(ball) ->
if (ball.visited = true || not <| ball.color.Equals(color)) then
()
else
//HERE's THE PROBLEM
if (ball_satisfy_a_certain_condition) then
b <- true
ball.visited := true
yield row, col // Add single item to results
yield! loop(row + 1, col + 1) // Add all generated to results
yield! loop(row - 1, col - 1) // -- || --
| None -> () }
loop(row, col) |> Seq.toList, b
Кажется, что изменяемая переменная не может быть получена замыканием (я не знаю, что это значит).
Итак, у меня есть 2 вопроса:
- почему вышеприведенное присвоение изменяемой переменной неверно?
- Как мне реорганизовать мой код для достижения этой цели?