[英]How do I pass a list to a function?
我正在嘗試創建一個接受卡片列表並返回沒有特定卡片的列表的函數。 如何將已定義類型的列表傳遞給函數?
我向該函數傳遞了一個列表,並指出我的類型不匹配。
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)* Card * string',但此處的類型為'(Rank * Suit)list'
這是因為您已將remove_card
函數定義為采用單個元組參數並返回值的函數,但是您卻像調用具有三個參數的函數一樣對其進行了調用。 要以您定義的方式調用remove_card
,您需要像remove_card (cards, card, "Err")
那樣調用它,創建三個參數的元組並使用它調用函數。 我認為您可能打算做的是:
let remove_card cardList cardToRemove err =
cardList
remove_card cards c "Err"
即創建一個具有三個參數而不是一個元組參數的函數。
F#中的參數語法與其他通用語言完全不同。
您的函數-盡管看起來有3個參數-實際上只有一個參數,它是3個組件的元組。
因此,您必須像remove_card (cards, c, "Err")
這樣稱呼它
但是,在慣用的F#中,沒有特殊要求,我們通常不使用元組作為參數。 相反,我們在需要時使用單獨的參數來利用部分應用程序 :
let remove_card cs (c:Card) (e:string) = ...
let remove_card_withFixedCards = remove_card cards
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.