[英]C# To F# loops to return a value
如何在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类型,但此处具有type单元
虽然您可以逐行将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。
如果您坚持保留代码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
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.