【问题标题】:Unable to instantiate a stack with a list无法用列表实例化堆栈
【发布时间】:2015-12-03 22:21:24
【问题描述】:

我正在努力解读此错误的含义:

无法确定方法“Stack`1”的唯一重载 在此程序点之前的类型信息。类型注释可以 被需要。候选人:System.Collections.Generic.Stack(容量:int) :单元,System.Collections.Generic.Stack(集合: System.Collections.Generic.IEnumerable) : 单位

尝试编写此代码时出现此错误:

let prepareDeck deck: Card list =
    let stack = System.Collections.Generic.Stack<Card>(deck)
    stack

我认为列表是 IEnumerable 类型的。 因此,我认为我可以将列表放入 Stack 构造函数中。

我错过了什么?

剩下的代码如下:

type Suit = | Spades
            | Clubs
            | Diamonds
            | Hearts

type Face = | Two | Three | Four | Five 
            | Six | Seven | Eight | Nine | Ten
            | Jack | Queen | King | Ace

type Card = {Face:Face; Suit:Suit}

let private suits = [Spades; Clubs; Diamonds ; Hearts]
let private faces = [Two; Three; Four; Five; Six; Seven; Eight; Nine; Ten;
             Jack; Queen; King; Ace]

let deck = [for suit in suits do
            for face in faces do
                yield {Face=face; Suit=suit}]


let prepareDeck deck: Card list =
    let stack = System.Collections.Generic.Stack<Card>(deck)
    stack

【问题讨论】:

  • 既然你好像在学F#,看看能不能避免使用Stack&lt;T&gt;,这是一个可变类型。默认的 F# list 已经为您提供了类似堆栈的功能,因为您可以将新的头添加到列表中,并且可以读取列表的头。
  • 好的。感谢您的指导,尽管当我尝试转向这种思维方法时,我的头骨很痛。

标签: f#


【解决方案1】:

您的代码现在的样子,Card list 是函数的结果,而不是参数上的类型注释。这就是为什么它可能会寻找返回 Card list 而不是 Stack 的堆栈构造函数。

试试这个:

let prepareDeck (deck: Card list) =
    let stack = System.Collections.Generic.Stack<Card>(deck)
    stack

【讨论】:

  • 该死的括号!谢谢。
  • @ScottNimrod 从你最近的问题来看,我的印象是使用括号会给你带来麻烦。在 F# 中查看括号的最佳方式可能是意识到它们是可选的。 F# 语法不规定括号的使用。相反,您经常需要将表达式group 在一起以覆盖默认的评估优先级。就像数学一样:1 + 2 * 3 = 7,但(1 + 2) * 3 = 9
  • 谢谢马克。不幸的是,我的数学从来都不好。但我现在确实有了更好的理解(从反复被烧伤)。现在,我只需要进行编程,以便将表达式和参数与相关结构隔离开来。或者当对编译器感到沮丧时,我会立即在问题上加上一些括号。伤心,我知道...
猜你喜欢
  • 2023-03-22
  • 2012-10-04
  • 1970-01-01
  • 2016-03-14
  • 2022-12-18
  • 2015-01-20
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多