小编use*_*943的帖子

C++到F#顺利翻译

嘿伙计们,我有以下C++代码.

for (int i=0; i < nObstacles; i++)
{
  int x,y;
  bool bAlreadyExists;
  do {          
    x = rand() % nGridWidth;
    y = rand() % nGridHeight;                   
  } while (HasObstacle(x, y));
  SetObstacle(x, y, true);      
}
Run Code Online (Sandbox Code Playgroud)

我可以直接将它翻译成F#没有问题.

let R = new System.Random()
for i=0 to nObstacles do
        let mutable bGoodToGo = false;
        let mutable x =0;
        let mutable y = 0
        while not bGoodToGo do
            x <-R.Next(nWidth)
            y <-R.Next(nHeight)
            bGoodToGo <- IsEmptyAt x y
        board.[x,y]<-Obstacle;
Run Code Online (Sandbox Code Playgroud)

当然,这可能会让你们大多数人感到畏缩,因为这不是F#的意思.这段代码为F#提供了一些"unkosher"概念,例如do-while循环和可变数据.

但我有兴趣看到的是一个带有不可变数据的"适当的"F#转换,以及某种等同的do-while.

c++ f# immutability code-translation

7
推荐指数
2
解决办法
379
查看次数

在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;
   }
Run Code Online (Sandbox Code Playgroud)

它很有效,但它很笨拙,并不是"F#方式",更不用说我有一种潜在的怀疑,即我在这里所做的并不是性能最佳.

我想要的是"将其展平"为使用"遍历所有单元格"的组合,"迭代来自此单元格的所有有效移动".

以下是我希望结合的功能:

let AllCells =
    seq {
        for y=0 to BOARDSIZE-1 do
            for x=0 to BOARDSIZE-1 do
                yield (x,y); …
Run Code Online (Sandbox Code Playgroud)

f# iterator yield lazy-sequences c#-to-f#

5
推荐指数
1
解决办法
771
查看次数