代码之家  ›  专栏  ›  技术社区  ›  gatoatigrado

如何避免f的seq.cast出现“值限制”错误?

  •  2
  • gatoatigrado  · 技术社区  · 14 年前

    我看到seq有一个从ienumerable到seq的强制转换函数,但是我如何使它工作呢?

    open System.Text.RegularExpressions;;
    let v = Regex.Match("abcd", "(ab)");;
    Seq.cast (v.Captures);;
    

    这就产生了,

    错误FS0030:值限制。已推断值“it”具有泛型类型 val it:顺序
    将“it”定义为一个简单的数据项,使其成为带有显式参数的函数,或者,如果不希望它是泛型的,则添加一个类型批注。

    2 回复  |  直到 14 年前
        1
  •  8
  •   Brian    14 年前

    明确类型:

    Seq.cast<Match> (v.Captures)
    

    否则 cast 需要上下文来推断正确的返回类型,并且在这样一行上,没有可供类型推断使用的上下文。

    (此行转换非泛型 IEnumerable 成为通用的 IEnumerable<Match> A.K.A. seq<Match> )

        2
  •  6
  •   Tomas Petricek    14 年前

    实际上,有两种方法可以指定要获取的类型。Brian发布了如何通过显式地将类型参数指定给函数来实现这一点:

    let res = Seq.cast<Match> v.Captures
    

    另一种选择是使用 类型批注 它可以放在任何f表达式周围,并指定表达式的类型-这样可以提示编译器类型推断(通过说某些表达式具有特定类型)。如果您以某种巧妙的方式提供信息,编译器将能够找出类型参数 Seq.cast 应该是。举几个例子:

    // By specifying type of the value
    let (res:seq<Match>) = Seq.cast v.Captures 
    
    // By specifying return type of a function
    let getCaptures () : seq<Match> = 
      // ...
      Seq.cast v.Captures
    
    // By specifying element type when iterating over the result
    for (m:Match) in Seq.cast v.Captures do
      // ...
    

    从所有选项中,我认为brians(显式)和我的第二个(函数的返回类型)是最惯用的,但是,您可以选择任何您认为最可读的选项。