【问题标题】:How do I pass a list to a function?如何将列表传递给函数?
【发布时间】:2019-05-19 16:18:42
【问题描述】:

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

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

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) * 卡片 * 字符串' 但这里有类型 '(等级 * 花色)列表'

【问题讨论】:

    标签: list types f#


    【解决方案1】:

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

    let remove_card cardList cardToRemove err = 
      cardList
    
    remove_card cards c "Err"
    

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-28
        • 2016-11-11
        • 2017-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多