Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics F#:IEnumerable<;元组<;TA、TB>&燃气轮机;与列表不兼容<;TA*TB>;?_Generics_F#_Tuples - Fatal编程技术网

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")