Generics F#:IEnumerable<;元组<;TA、TB>&燃气轮机;与列表不兼容<;TA*TB>;?
因此,我有以下代码,它给出了一个类型不匹配编译器错误,我不知道为什么:Generics F#:IEnumerable<;元组<;TA、TB>&燃气轮机;与列表不兼容<;TA*TB>;?,generics,f#,tuples,Generics,F#,Tuples,因此,我有以下代码,它给出了一个类型不匹配编译器错误,我不知道为什么: [<Test>] member this.TheTest() = let tuple = (DateTime.Now, 10) let listOfTuples = [ tuple ] SomeType.SomeFunc(listOfTuples) static member SomeFunc (listOfTuples: IEnumerable<Tuple<DateTime
[<Test>]
member this.TheTest() =
let tuple = (DateTime.Now, 10)
let listOfTuples = [ tuple ]
SomeType.SomeFunc(listOfTuples)
static member SomeFunc (listOfTuples: IEnumerable<Tuple<DateTime,int>>) =
Console.WriteLine("foo")
[]
成员:this.TheTest()=
让tuple=(DateTime.Now,10)
让listOfTuples=[元组]
SomeType.SomeFunc(listOfTuples)
静态成员SomeFunc(listOfTuples:IEnumerable)=
控制台写入线(“foo”)
为什么这些类型不兼容
更重要的是,我如何表达
SomeFunc
的签名以与调用兼容?这里的实际问题是试图将('a*'b)
传递到使用元组的函数中。虽然它们的内部表示形式相同,但F#编译器对这两种表示方式的处理方式不同
这在以下文件中有详细说明:
当视为静态类型时,元组类型与其编码形式不同。但是,元组值和类型的编码形式在F#type系统中通过运行时类型可见
问题是编译器正在使用“静态类型”来查看这个函数是否匹配,而根据规范,它不是
更重要的是,如何表达SomeFunc的签名以与调用兼容
你可以用各种方法来解决这个问题。最简单的方法是重新定义方法上的类型规范,以使用元组表达式:
static member SomeFunc (listOfTuples: IEnumerable<(DateTime * int)>) =
Console.WriteLine("foo")
这基本上是同一个问题:这只是System.Tuple和Tuple表达式之间的不匹配这不完全相同,因为这个问题的答案是关于一个Tuple中元素的数量,但是在我的问题中,我只是问一个特定长度的2@ReedCopsey:更新问题,表达其最终目的(与副本不匹配)您是否尝试了seq
而不是IEnumerable
?请注意,将IEnumerable
替换为seq
是不必要的(它们实际上是等价的),只是因为比较短,所以比较方便。必要的部分是将元组
替换为a*b
。
static member SomeFunc (listOfTuples: (DateTime * int) seq) =
Console.WriteLine("foo")