Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 选择数组索引的三元运算符_F# - Fatal编程技术网

F# 选择数组索引的三元运算符

F# 选择数组索引的三元运算符,f#,F#,表达式中出现意外的']' 我已经成功地完成了代码的第一部分,现在我想使用存储在成员中的索引查找球员的真实得分。我使用playersTurn并检查它是否是奇数或偶数来代表玩家的回合 我现在遇到的问题是使用三元运算符获得以下代码行中的分数: let score = this.scoring[this.playersTurn % 2 = 0 ? this.playerOneScore : this.playerTwoScore] 任何帮助都会非常出色,以下是完整的代码: open System t

表达式中出现意外的']'

我已经成功地完成了代码的第一部分,现在我想使用存储在成员中的索引查找球员的真实得分。我使用playersTurn并检查它是否是奇数或偶数来代表玩家的回合

我现在遇到的问题是使用三元运算符获得以下代码行中的分数:

let score = this.scoring[this.playersTurn % 2 = 0 ? this.playerOneScore : this.playerTwoScore]
任何帮助都会非常出色,以下是完整的代码:

open System

type Game(playerOne, playerTwo) =
 member this.playersTurn = 0
 member this.playerOneName = playerOne
 member this.playerOneScore = 0
 member this.playerTwoName = playerTwo
 member this.playerTwoScore = 0
 member this.scoring = [|0; 15; 30; 40|]

 member this.takeTurn() =
  let name = this.playersTurn % 2 = 0 ? this.playerOneName : this.playerTwoName
  let score = this.scoring[this.playersTurn % 2 = 0 ? this.playerOneScore : this.playerTwoScore]
  printfn name |> "%d is now taking their turn."
  if((new System.Random()).Next(0, 15) > 8) then
   if (this.playersTurn % 2 = 0) then incr this.playerOneScore
   else incr this.playerTwoScore
   printfn name |> "%d scored a point!"
  else
   printfn name |> "%d did not score a point!"
  incr this.playersTurn

let tennis = new Game("Player1", "Player2")
tennis.takeTurn()
tennis.takeTurn()

对于F中的三元运算符,您使用的是C语法。您确实需要:

this.scoring.[if this.playersTurn % 2 = 0 then this.playerOneScore else this.playerTwoScore]

对于F中的三元运算符,您使用的是C语法。您确实需要:

this.scoring.[if this.playersTurn % 2 = 0 then this.playerOneScore else this.playerTwoScore]

要使代码正常工作,您需要再做一些更改。最重要的是,您正在使用带有成员的类,但这些是F中的只读getter属性。您可以使它们可变,但这不是惯用的;更好的选择是更改函数,使其返回新的游戏状态

如果您正在学习F,那么我认为最好进行更多的更改,避免使用在F中不经常使用的类,并寻求不需要变异的解决方案。以下内容与您所拥有的内容非常接近

我将常见定义提取到普通let值中-您可以稍后定义一个记录简单数据类型来保存它们,但现在,这是最简单的选项:

open System

let scoring = [|0; 15; 30; 40|]
let playerOne = "Player1"
let playerTwo = "Player2"
let rnd = new System.Random()
我将您的方法转换为一个函数,该函数将圈数和初始分数作为元组,并返回新状态。语法playersTurn、playersecore、playerswoscore定义了一个包含圈数的元组和一个包含两个分数的嵌套元组。我选择这两个分数是因为这两个分数在逻辑上是相关的,所以最好将它们存储在一起:

let takeTurn (playersTurn, (playerOneScore, playerTwoScore)) = 
  let name = if playersTurn % 2 = 0 then playerOne else playerTwo
  let score = scoring.[if playersTurn % 2 = 0 then playerOneScore else playerTwoScore]
  printfn "%s is now taking their turn." name
  let newOneScore, newTwoScore = 
    if (rnd.Next(0, 15) > 8) then
      printfn "%s scored a point!" name
      if (playersTurn % 2 = 0) then playerOneScore + 1, playerTwoScore
      else playerOneScore, playerTwoScore + 1
    else
      printfn "%s did not score a point!" name
      playerOneScore, playerTwoScore
  playersTurn+1, (newOneScore, newTwoScore)
现在,您可以定义初始状态并重复调用takeTurn以获取下一个状态和下一个状态,依此类推:

let start = 0, (0, 0)
let step1 = takeTurn start
let step2 = takeTurn step1

很明显,您希望在循环中运行它—您可以通过使用递归或使用Seq.unfold之类的函数以函数的方式执行此操作。

要使代码正常工作,您需要再做一些更改。最重要的是,您正在使用带有成员的类,但这些是F中的只读getter属性。您可以使它们可变,但这不是惯用的;更好的选择是更改函数,使其返回新的游戏状态

如果您正在学习F,那么我认为最好进行更多的更改,避免使用在F中不经常使用的类,并寻求不需要变异的解决方案。以下内容与您所拥有的内容非常接近

我将常见定义提取到普通let值中-您可以稍后定义一个记录简单数据类型来保存它们,但现在,这是最简单的选项:

open System

let scoring = [|0; 15; 30; 40|]
let playerOne = "Player1"
let playerTwo = "Player2"
let rnd = new System.Random()
我将您的方法转换为一个函数,该函数将圈数和初始分数作为元组,并返回新状态。语法playersTurn、playersecore、playerswoscore定义了一个包含圈数的元组和一个包含两个分数的嵌套元组。我选择这两个分数是因为这两个分数在逻辑上是相关的,所以最好将它们存储在一起:

let takeTurn (playersTurn, (playerOneScore, playerTwoScore)) = 
  let name = if playersTurn % 2 = 0 then playerOne else playerTwo
  let score = scoring.[if playersTurn % 2 = 0 then playerOneScore else playerTwoScore]
  printfn "%s is now taking their turn." name
  let newOneScore, newTwoScore = 
    if (rnd.Next(0, 15) > 8) then
      printfn "%s scored a point!" name
      if (playersTurn % 2 = 0) then playerOneScore + 1, playerTwoScore
      else playerOneScore, playerTwoScore + 1
    else
      printfn "%s did not score a point!" name
      playerOneScore, playerTwoScore
  playersTurn+1, (newOneScore, newTwoScore)
现在,您可以定义初始状态并重复调用takeTurn以获取下一个状态和下一个状态,依此类推:

let start = 0, (0, 0)
let step1 = takeTurn start
let step2 = takeTurn step1

很明显,您希望在循环中运行它—您可以使用递归或使用Seq.unfold之类的函数以函数的方式运行它。

Quick look。一个是数组[| |],一个是列表[],所以结合贾斯汀·尼斯纳的回答和这个评论,应该是这样的。评分[|索引|]@GuyCoderYeah,我想会的。我不是一个F的家伙,只是想学习哈哈。我很感激。我用Justins answer in all use case@Guycoder更新了三元代码基于这一点和你之前的问题,我建议你多学习一点F语言,在尝试更严肃的事情之前,先阅读一些hello world类型的教程。你应该保留这段代码,这对于一个教学练习来说是很好的,因为问题一开始看起来很简单,但一旦解决就变得复杂了。快看。一个是数组[| |],一个是列表[],所以结合贾斯汀·尼斯纳的回答和这个评论,应该是这样的。评分[|索引|]@GuyCoderYeah,我想会的。我不是一个F的家伙,只是想学习哈哈。我很感激。我用Justins answer in all use case@Guycoder更新了三元代码基于这一点和你之前的问题,我建议你多学习一点F语言,在尝试更严肃的事情之前,先阅读一些hello world类型的教程。你应该保留这段代码,这对于一个教学练习来说是很好的,因为问题一开始看起来很简单,但一旦解决就变得复杂了。得分后会漏掉一个点。索引器访问在F中是不同的。同样,修复三元运算符的首次使用。评分后缺少一个点。索引器访问在F中是不同的。另外,修复三元运算符的首次使用。感谢您发布代码,重申我关于回到基本原理的评论。天哪,这里有很多
我需要调查一下!谢谢你!你是否正确增加了分数。它看起来像+1,而不是爱的网球,15,30,40。@KDOT我添加了一些评论,希望能解释我的改变。你的逻辑核心是正确的-我基本上只是删除了类和变异!代码执行数组查找以获得分数,但这从未打印或在任何地方使用-因此计数是可以的,但我想你会想在某个地方打印分数:感谢发布代码,重申我关于回到基本面的评论。天哪,这里有很多我需要研究的内容!谢谢你!你是否正确增加了分数。它看起来像+1,而不是爱的网球,15,30,40。@KDOT我添加了一些评论,希望能解释我的改变。你的逻辑核心是正确的-我基本上只是删除了类和变异!代码执行数组查找以获得分数,但这从未打印或在任何地方使用-因此计数是可以的,但我认为您希望在某个地方打印分数: