IEnumerable和数组理解

nic*_*las 1 ienumerable f# list-comprehension

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

类型关系与seq <'a>不兼容

而第一个推断r的类型关系.

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 
        ()
Run Code Online (Sandbox Code Playgroud)

什么精确的属性可以循环使用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 
          ()
Run Code Online (Sandbox Code Playgroud)

r被输入为Relation,而不是obj

Dan*_*iel 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>'
Run Code Online (Sandbox Code Playgroud)

对于在.NET 2.0之前创建的库,此方案尤其常见.