如何将列表传递给函数?

时间:2019-05-19 16:18:42

标签: list types f#

我正在尝试创建一个接受卡片列表并返回没有特定卡片的列表的函数。如何将已定义类型的列表传递给函数?

我向该函数传递了一个列表,并指出我的类型不匹配。

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时可以正确返回的预期列表。 但是,会引发错误:

该表达式应具有类型     '('a->'b->'c)*卡*字符串' 但是这里有类型     “(排名*西装)列表”

2 个答案:

答案 0 :(得分:3)

这是因为您已将remove_card函数定义为接受单个元组参数并返回值的函数,但您却像调用具有三个参数的函数一样对其进行了调用。要现在以定义的方式调用remove_card,就需要像remove_card (cards, card, "Err")那样调用它,创建三个参数的元组并使用它来调用函数。我想您可能打算做的是:

let remove_card cardList cardToRemove err = 
  cardList

remove_card cards c "Err"

即创建具有三个参数而不是单个元组参数的函数。

答案 1 :(得分:2)

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