-1

如何在 f# 中编写此代码

 int IAI.AIMove()
    {
        for (int i = 0; i <= 8; i++)
            if (cBoard.getPlayer(i) == 0)
                return i;
        return 0;
    }

这就是我所拥有的

member this.AIMove()=
      let result =  int in
        for i in 1 .. 8 do
            if cboard.getPlayer(i)=0 then
               result := Some i

[错误] 此表达式应为 int 类型,但此处为 unit 类型

4

3 回答 3

2

虽然您可以将 C# 代码逐行重写为 F#,但您不会真正获得 F# 的优雅。我建议先解决一些非常简单的问题(例如处理列表),然后考虑如何将项目设计得更实用。

要回答您的问题,您可以使用List.tryFind而不是循环和突变:

let idx = [ 0 .. 8 ] |> List.tryFind (fun i -> cBoard.getPlayer(i) = 0)

这会生成一个包含从 0 到 1 的数字的列表,然后返回第一个数字,使得给定的谓词返回 true。这与您的代码的行为有点不同 - 它返回option<int>的要么None是找不到值,要么是找到Some(i)了值。

使用选项和模式匹配可能是个好主意,但defaultArg idx 0如果找不到该值,您可以使用它返回 0。

于 2013-10-01T05:45:15.333 回答
1
type Board =
    member x.getPlayer (i: int) = 0 // Just a stub to allow typechecking

let move (cBoard: Board) =
    let isZero x = x = 0
    let found = seq { 0 .. 8 } |> Seq.tryFind (cBoard.getPlayer >> isZero)
    defaultArg found 0
于 2013-10-01T05:57:52.100 回答
1

如果您坚持保留您的代码 C#'ish:

member this.AIMove () : int option =
  let result = ref None
  for i in 1 .. 8 do
    if cboard.getPlayer(i)=0 then
      result := Some i
  match !result with
  | Some i -> i
  | None -> 0
于 2013-10-01T05:47:30.630 回答