F#如何将类型添加到列表中?
因此,我正试图用F#为学校项目创建一个纸牌游戏。我来自C,在理解F中的东西时遇到了问题。我有打字机F#如何将类型添加到列表中?,f#,F#,因此,我正试图用F#为学校项目创建一个纸牌游戏。我来自C,在理解F中的东西时遇到了问题。我有打字机 Player={Name:String;Hand:Card list}代表玩家的 然后我有一副牌,里面有牌。如何将第一张牌从牌组移动到玩家手上?在C语言中,我会使用类似于removeat[I]的东西 let returnFirstElement list = match list with | h::t -> Some(h),t | [] -> None,[] 将您的列表
Player={Name:String;Hand:Card list}
代表玩家的
然后我有一副牌,里面有牌。如何将第一张牌从牌组移动到玩家手上?在C语言中,我会使用类似于removeat[I]
的东西
let returnFirstElement list =
match list with
| h::t -> Some(h),t
| [] -> None,[]
将您的列表传递到该列表中,它将返回一个元组。第一个值是你的卡,第二个值是牌组的其余部分。
如果你的牌组中的牌用完了,那么你就不会拿回一张牌。
由于您来自C#背景,请将Some
视为可空类型,将None
视为空类型。如果你不确定使用它们是非常普遍的,那么可以查看F#部分
和无
你可以这样使用它
let (topCard, restOfDeck) = returnFirstElement deckOfCards
如果需要,您可以提供更多帮助,但这应该是一个很好的开始。您当然也可以在F#中使用任何.Net。这不是惯用的F#,但同样,递归有多少值得商榷。基本上,如果您想从F#list中删除一个元素,那么F#list可能不是最好的集合。当然,您可以随时对其应用
filter
。但是如果所有项目都是唯一的,请考虑使用SET。
以下是带有.RemoveAt的版本:
open System.Collections.Generic
let xs = ResizeArray [1;2;3]
xs.RemoveAt(2)
xs
ResizeArray是C#List的同义词
关于只移动第一张卡,然后拿走其余的卡,您可以使用“尾”和“头”功能 要用F#编写惯用的函数代码,您需要考虑如何显式地建模系统的状态。每个玩家都有一手代表部分状态的牌,但我们也需要对牌组的状态进行建模 从逻辑上讲,从牌组中绘画会影响玩家的手部和牌组本身
我们还需要考虑甲板上没有卡片时的错误情况。
type Player = {Name : string; Hand : Card list}
let draw player deck =
match deck with
|[] -> invalidArg "deck" "No cards in deck!"
|drawn::rest -> ({ player with Hand = drawn :: player.Hand }, rest)
下面是一个简单的例子,当牌组中没有剩余的牌时,会出现错误
type Player = {Name : string; Hand : Card list}
let draw player deck =
match deck with
|[] -> invalidArg "deck" "No cards in deck!"
|drawn::rest -> ({ player with Hand = drawn :: player.Hand }, rest)
您向draw函数提供一个玩家
和一个由卡牌列表
表示的牌组,它会返回一个新的玩家
,其中一张牌是从牌组中取出的,另一张新的卡牌列表
,而没有抽出的卡
对于某些游戏,你最好有两张牌的列表,一张用来抽牌,一张用来弃牌。然后,当你的牌用完时,你可以通过洗牌来创建一个新的牌组。F#列表是不可变的,因此你不会移除一个项目,你会返回一对类似于
(玩家,牌列表)
的东西,其中包含玩家和剩余的牌。你能添加一个函数的例子来填充玩家吗?谢谢,这正是我想要的。我现在可以用:let(topCard,deck)=playCard deck来获得牌,这就是它应该做的,从牌堆中移除一张牌,等等。现在剩下的就是我如何把那张topCard放到玩家手上?List.append需要另一个列表。除了上一个列表,我现在从该函数中获得“数字选项”,即使手是“数字列表”。从带有“let testlist=[card]”的卡片创建一个新的列表将使其成为“数字选项列表”。您好@Kamsiinov,您遇到的问题是数字选项不是数字。正如我在回答中所说,它实际上是一个可为空的数字,您必须处理这两个选项<代码>一些数字和无
。我建议你读一下这篇文章,这样你就能理解如何处理选项了是的,我后来理解了这个选项是什么。