Incompatibilidade de tipo F # Seq.head e Seq.tail com tipos personalizados
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
Eu tenho tipos personalizadosRank
eSuit
, combinado em um tipo personalizadoCard
e uma coleção de tipos personalizadosHand
que é uma sequência de cartões.
Quando eu usoSeq.head
no recursivohandValue
função recebo o erro:
Era esperado que essa expressão tivesse tipo'Card'
mas aqui tem tipo''a -> 'b'
Fiquei com a impressão de que, como ohand
é uma sequência deCard
, queSeq.head
retornaria o primeiro elemento na sequência, como tipoCard
.
Também quando eu usoSeq.tail
Eu recebo o erro:
O tipo''a -> seq<'b>'
não é compatível com o tipo'Hand'
Fiquei com a impressão de queSeq.tail
retornaria uma sequência deCard
, que embora não declarado explicitamente comoHand
deve ser idêntico em funcionalidade.
Não tenho certeza de como abordar o primeiro erro.e, para o segundo erro, qual seria o mais apropriado; lançando oHand
digite para umSequence
digite e usandoSeq.tail
, lançando o retornadoSequence
digite comoHand
tipo.
Ou talvez haja algo menor na sintaxe que estou ignorando completamente. Qualquer ajuda seria muito apreciada.