IEnumerable和数组理解

时间:2013-10-03 14:09:01

标签: f# ienumerable list-comprehension

我想知道为什么第二行会报告编译器错误

  

类型的关系与seq<'a>

不兼容

而第一个推断r的类型为Relation。

type Microsoft.Office.Interop.Access.Dao.Database with 
    member x.f() =
        let relations =  [for r in x.Relations -> r]
        let relations2 =  x.Relations |> Seq.map id 
        ()

使用for?

可以使用什么精确属性来循环关系

// 编辑复制步骤:

我在VS2012中创建一个空白解决方案,添加对Microsoft.Office.Interop.Access.Dao的引用,并粘贴下面的代码。

module toto = 
  type Class1() = 
      member this.X = "F#"

  type Microsoft.Office.Interop.Access.Dao.Database with 
      member x.f() =
          let relations =  [for r in x.Relations -> r]
          let relations2 =  x.Relations |> Seq.map id 
          ()

r被输入为Relation,而不是obj

1 个答案:

答案 0 :(得分:6)

这与你所说的并不完全相符,但是一个类型实现Seq.map而不是System.Collections.IEnumerable的情况下,序列表达式可以工作而不是System.Collections.Generic.IEnumerable<'T>的一种情况(又名seq<'T>)。例如,在此代码中,t被推断为obj list,但下一行不会编译。

type T() =
  interface System.Collections.IEnumerable with
    member x.GetEnumerator() = (Seq.init 10 id).GetEnumerator() :> _

let t = [for x in T() -> x]
let t2 = T() |> Seq.map id //ERROR: The type 'T' is not compatible with the type 'seq<'a>'

此方案对于在.NET 2.0之前创建的库特别常见。