List 预定义列表F的和#

List 预定义列表F的和#,list,recursion,f#,sum,blackjack,List,Recursion,F#,Sum,Blackjack,我是一名初学者,目前正在21点F#实现中尝试一些列表操作 我试图将我创建的列表中的元素汇总如下: let cardsvalue (k: Cards): List<int> = match k with |Ace -> [1;11] |Two -> [2] |Three -> [3] |Four -> [4] |Five -> [5] |Six -> [6] |Seven ->

我是一名初学者,目前正在21点F#实现中尝试一些列表操作

我试图将我创建的列表中的元素汇总如下:

let cardsvalue (k: Cards): List<int> =
    match k with
    |Ace ->  [1;11]
    |Two -> [2] 
    |Three -> [3]
    |Four -> [4]
    |Five -> [5]
    |Six -> [6]
    |Seven -> [7]
    |Eight -> [8]
    |Nine -> [9]
    |Ten | Jack | Queen | King -> [10] 
不接受+反对者

我希望看到这个问题的可能实施。谢谢你抽出时间

我是初学者

您的代码显示了一种很好的系统方法,并且您已经完成了大部分工作,以允许类型系统(和intellisense)帮助解决您的问题

let cardsvalue(k:Cards):列表=
一个具有正确类型签名的有用函数。请注意,它已变灰。这意味着你没有使用它

let rec CardPoints(cp:List):List=
也完全正确。您正在尽可能多地帮助类型系统,这使得它几乎可以肯定,它将发现某些错误的确切位置

我总是以类型不匹配或不支持运算符错误而告终。比如说

let rec CardPoints (cp: List<Cards>): List<int> =   
   match cp with
   | head :: tail -> head + CardPoints tail
   | [] -> 0 
| head::tail->head+CardPoints tail
尝试使用绑定来帮助解决此问题:

|头::尾->
让tailPoints=CardPoints tail
头+尾点
您可以(通过将鼠标悬停在它们上方)判断
头部
卡片
尾点
列表
。因此,您正在尝试将
添加到
列表
中,但没有定义此类添加操作


因此,您已经将其细化为一个较小的任务:给定一张卡(
头:卡
),并从剩余卡中给定可能的点(
尾点:列表
),如何从所有卡中找到可能的点,这应该是一张
列表
?您将需要使用当前未使用的函数
cardsvalue
和另一小步,然后您就可以使用了。

好的,您的答案非常接近。 但是您正在尝试将一张“卡”添加到INT列表中。 你要做的是把每一张卡的可能值加在其他卡的总和上

好吧,我可能不会这么做,但也许这是最容易理解的答案(假设你理解列表理解)

它在功能上也不是很完美,但我会让你去发现和修复它

let rec cardPoints (cp: List<Card>): List<int> =   
   match cp with
   | head :: tail -> 
        [ for val1 in cardsvalue head do
            for val2 in cardPoints tail do 
                val1 + val2 ]
   | [] -> [0]
let rec cardPoints(cp:List):List=
匹配cp
|头:尾->
[对于卡片中的val1值头do
对于cardPoints尾部的val2,请执行以下操作
val1+val2]
| [] -> [0]

您正试图将一个数字添加到数字列表中。您非常接近,因此告诉您会破坏它。您介意分享吗?这里的问题是,这群人从那些想让你做家庭作业的人那里得到帖子……因此,人们对明确给出全部答案感到非常紧张。是的,我看得出来。我想人们会更乐意留下一个没有答案的问题。你能展示一下它是怎么做到的吗?我无法让它发挥作用。最后一个问题-您如何实现Ace得分不超过21分的条件,例如
[Ace;Ace;Ace]
应仅为13(1+1+11)和
[Ace;5;Ace]
将是17。我个人会定义我自己的
类型点=int的Hard of int | int的Soft of int*int
,然后使用类似这样的
将cp与| Hard x->Hard x | Soft(x,y)->如果y>21,那么Hard x,else Soft(x,y)
匹配,但这需要我重新编写所有内容。你能告诉我,如果我们使用第三个函数,例如
let-CalScore(cp:List):int=
@BillyFitt,它会是什么样子吗?我会得到原始问题并尝试在尝试扩展或替代之前工作。您需要创建一个函数,该函数给定一个
Cards
和一个
int-list
剩余卡片的可能分数,将返回整个可能分数的
int-list
。您已经有了一个功能,可以从卡中获得可能的分数。这可以用来简化问题,消除
,因此在剩下的步骤中,您只需使用ints即可。最初的问题是我在帖子中提出的。你能告诉我怎么做吗,我的意思是使用我目前未使用的函数cardsvalue和另一小步-我不知怎么的仍然无法让它正常工作你的cardsvalue函数给你第一张卡的可能值(一个
int list
),递归给你
尾点,另一个
int list
。因此问题归结为:给定两个
int list
s,找出所有可能的和。要做到这一点,您可能会发现使用函数
List.map
List.concat
,或者使用“yield”语法来构造一个列表
[对于某些序列中的x,do yield f(x)]
。谢谢!你可能想编辑
yield
val1+val2
。我还没有测试过这一点,隐式收益在F#中是受支持的,所以在我看来它是有效的,它会给出重复的。