Создание составного итератора в F #

Я реализую игру, похожую на шашки, и мне нужна последовательность, которая перечисляет все допустимые ходы для данной конфигурации.

] У меня есть следующая функция, прямо переведенная с C #:

seq {
    for y1 = 0 to BOARDSIZE-1 do
        for x1 = 0 to BOARDSIZE-1 do
             for dy = -2 to 2 do
                 for dx = -2 to 2 do
                     let x2 = x1 + dx;
                     let y2 = y1 + dy;
                     let currentMove = new MoveStruct(x1, y1, x2, y2);
                     if (currentMove.SomeCondition = true) then
                             yield currentMove;
   }

Она работает, но неудобна, и не совсем в духе F #, не говоря уже о том, что у меня есть скрытое подозрение, что я выполнение m здесь не является оптимальным с точки зрения производительности.

Я бы хотел «сгладить это» до чего-то, что использует комбинацию «итерация по всем ячейкам», «итерация по всем допустимым ходам из этой ячейки».

И вот функции, которые я надеюсь объединить:

let AllCells =
    seq {
        for y=0 to BOARDSIZE-1 do
            for x=0 to BOARDSIZE-1 do
                yield (x,y);
    };

И

let LegalMovesAround(x1,y1) = 
    seq {
      if board.[x1, y1] = WHITE then
        for dy = -2 to 2 do
          for dx = -2 to 2 do
                let x2 = x1 + dx;
                let y2 = y1 + dy;
                let currentMove = new MoveStruct(x1, y1, x2, y2);
                if (currentMove.DetermineMoveType <> MoveType.ILLEGAL 
                    && board.[x2, y2] = NONE) then
                        yield currentMove;
     }

Я избавлю вас от подробностей моих различных попыток заставить это работать, потому что ни одна из них не увенчалась успехом. Но, короче говоря, лучшее, что я мог придумать, - это итератор, который возвращает seq с каждым yield, вместо сглаженной версии, которую я ищу, которая возвращала бы простой MoveStruct.

Кто-нибудь знает, как объединить AllCells и LegalMovesAround (x, y)?

С уважением, во что-то, что использует комбинацию «итерация по всем ячейкам», «итерация по всем допустимым ходам из этой ячейки».

А вот функции, которые я надеюсь объединить:

let AllCells =
    seq {
        for y=0 to BOARDSIZE-1 do
            for x=0 to BOARDSIZE-1 do
                yield (x,y);
    };

И

let LegalMovesAround(x1,y1) = 
    seq {
      if board.[x1, y1] = WHITE then
        for dy = -2 to 2 do
          for dx = -2 to 2 do
                let x2 = x1 + dx;
                let y2 = y1 + dy;
                let currentMove = new MoveStruct(x1, y1, x2, y2);
                if (currentMove.DetermineMoveType <> MoveType.ILLEGAL 
                    && board.[x2, y2] = NONE) then
                        yield currentMove;
     }

Я собираюсь избавить вас от подробностей моих различных попыток заставить его работать, потому что ни одна из них не увенчалась успехом. Но, короче говоря, лучшее, что я мог придумать, - это итератор, который возвращает seq с каждым yield, вместо сглаженной версии, которую я ищу, которая возвращала бы простой MoveStruct.

Кто-нибудь знает, как объединить AllCells и LegalMovesAround (x, y)?

С уважением, во что-то, что использует комбинацию «итерация по всем ячейкам», «итерация по всем допустимым ходам из этой ячейки».

А вот функции, которые я надеюсь объединить:

let AllCells =
    seq {
        for y=0 to BOARDSIZE-1 do
            for x=0 to BOARDSIZE-1 do
                yield (x,y);
    };

И

let LegalMovesAround(x1,y1) = 
    seq {
      if board.[x1, y1] = WHITE then
        for dy = -2 to 2 do
          for dx = -2 to 2 do
                let x2 = x1 + dx;
                let y2 = y1 + dy;
                let currentMove = new MoveStruct(x1, y1, x2, y2);
                if (currentMove.DetermineMoveType <> MoveType.ILLEGAL 
                    && board.[x2, y2] = NONE) then
                        yield currentMove;
     }

Я собираюсь избавить вас от подробностей моих различных попыток заставить его работать, потому что ни одна из них не увенчалась успехом. Но, короче говоря, лучшее, что я мог придумать, - это итератор, который возвращает seq с каждым yield, вместо сглаженной версии, которую я ищу, которая возвращала бы простой MoveStruct.

Кто-нибудь знает, как объединить AllCells и LegalMovesAround (x, y)?

С уважением, Я избавлю вас от подробностей моих различных попыток заставить его работать, потому что ни одна из них не увенчалась успехом. Но, короче говоря, лучшее, что я мог придумать, - это итератор, который возвращает seq с каждым yield, вместо сглаженной версии, которую я ищу, которая возвращала бы простой MoveStruct.

Кто-нибудь знает, как объединить AllCells и LegalMovesAround (x, y)?

С уважением, Я избавлю вас от подробностей моих различных попыток заставить его работать, потому что ни одна из них не увенчалась успехом. Но, короче говоря, лучшее, что я мог придумать, - это итератор, который возвращает seq с каждым yield вместо сглаженной версии, которую я ищу, которая возвращала бы простой MoveStruct.

Кто-нибудь знает, как объединить AllCells и LegalMovesAround (x, y)?

С уважением, Aleks

5
задан user627943 22 February 2011 в 08:45
поделиться