gpt4 book ai didi

F# Seq.head & Seq.tail 类型与自定义类型不匹配

转载 作者:行者123 更新时间:2023-12-05 00:42:10 28 4
gpt4 key购买 nike

type Suit = Spades | Clubs | Hearts | Diamonds
type Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King
type Card = {suit: Suit; rank: Rank}

type Hand = Card seq

let AllSuits = [ Spades; Clubs; Hearts; Diamonds ]
let AllRanks = [ Ace; Two; Three; Four; Five; Six; Seven; Eight; Nine; Ten; Jack; Queen; King ]

let cardValue (card:Card) =
match card.rank with
| Ace -> 1
| Two -> 2
| Three -> 3
| Four -> 4
| Five -> 5
| Six -> 6
| Seven -> 7
| Eight -> 8
| Nine -> 9
| Ten | Jack | Queen | King -> 10

let rec handValue (hand:Hand) =
if Seq.length hand = 1
then cardValue Seq.head
else cardValue Seq.head + handValue Seq.tail

我有自定义类型 Rank , 和 Suit , 组合成自定义类型 Card , 和自定义类型集合 Hand这是一系列卡片。

当我使用 Seq.head 时在递归 handValue函数我得到错误:

此表达式的类型应为 'Card'但这里有类型 ''a -> 'b'

我的印象是 handCard 的序列, 那 Seq.head将返回序列中的第一个元素,类型为 Card .

当我使用 Seq.tail 时我得到了错误:

类型''a -> seq<'b>''Hand' 类型不兼容

我的印象是 Seq.tail将返回 Card 的序列, 虽然没有明确声明为 Hand功能上应该相同。

我完全不确定如何处理第一个错误,对于第二个错误,最合适的方法是什么;类型转换Hand键入 Sequence输入并使用 Seq.tail , 类型转换返回的 Sequence键入 Hand输入。

或者我完全忽略了语法中的一些小问题。任何帮助将不胜感激。

最佳答案

你将 cardValue 传递给 Seq.head function;您需要先应用该函数并传递结果:

let rec handValue (hand:Hand) =
if Seq.length hand = 1
then cardValue (Seq.head hand)
else cardValue (Seq.head hand) + handValue (Seq.tail hand)

注意如果传递一个空序列并且不是尾递归,这将失败;修复这些,加上一些冗余删除,会产生类似的结果:

let handValue hand =
let rec impl acc h =
if Seq.isEmpty h then acc
else impl (cardValue (Seq.head h) + acc) (Seq.tail h)
impl 0 hand

也就是说,这非常效率低下;当使用 list 而不是 seq 时,此代码结构可以正常工作,但使用高阶函数处理会更好后者:

let handValue hand = hand |> Seq.sumBy cardValue

关于F# Seq.head & Seq.tail 类型与自定义类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43554167/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com