我正在尝试创建一个函数,它接受一个卡片列表,并返回一个不包含特定卡片的列表。如何将已定义类型的列表传递给函数?
我向函数传递了一个列表,它指出我的类型不匹配。
type Suit = Clubs | Diamonds | Hearts | Spades
type Rank = Jack | Queen | King | Ace | Num of int
type Card = Rank * Suit
type Color = Red | Black
type Move = Discard of Card | Draw
let cards = [(Jack,Clubs); (Num(8),Spades)]
let c:Card = Jack, Clubs
let remove_card (cs, c:Card, e:string) =
cs
remove_card cards c "Err"
调用函数remove_card时应返回正确的list。但是,抛出了错误:
此表达式的类型应为'('a -> 'b -> 'c) * Card * string‘,但此处的类型为'(Rank * Suit) list’
发布于 2019-05-20 01:08:10
这是因为您已经将remove_card
函数定义为一个接受单个元组参数并返回值的函数,但是您调用它时就像一个接受三个参数的函数一样。要按照现在定义的方式调用remove_card
,需要像调用remove_card (cards, card, "Err")
一样调用它,创建三参数元组并使用它调用函数。我想你可能想做的是:
let remove_card cardList cardToRemove err =
cardList
remove_card cards c "Err"
即创建一个具有三个参数的函数,而不是一个元组参数。
发布于 2019-05-20 01:16:21
F#中的参数语法与其他常见语言有很大不同。
您的函数-尽管看起来有3个参数-实际上只有一个参数,即3个组件的元组。
所以你必须把它叫做remove_card (cards, c, "Err")
然而,在惯用F#中,如果没有特殊要求,我们通常不使用元组作为参数。相反,我们在需要时使用单独的参数来利用partial application:
let remove_card cs (c:Card) (e:string) = ...
let remove_card_withFixedCards = remove_card cards
https://stackoverflow.com/questions/56209723
复制相似问题