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,[] 将您的列表

因此,我正试图用F#为学校项目创建一个纸牌游戏。我来自C,在理解F中的东西时遇到了问题。我有打字机

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,您遇到的问题是数字选项不是数字。正如我在回答中所说,它实际上是一个可为空的数字,您必须处理这两个选项<代码>一些数字和
。我建议你读一下这篇文章,这样你就能理解如何处理
选项了是的,我后来理解了这个选项是什么。