为什么输出是<;seq>;而不是F#中的int?
这是我的代码:为什么输出是<;seq>;而不是F#中的int?,f#,F#,这是我的代码: Csv.GetSample().Rows |> Seq.groupBy (fun row -> row.STATE,row.INCOME,row.CHILDREN) |> Seq.map (fun ((state,income,children),data) -> let pctrepub = data|> Seq.map (fun row -> (100.0 - float row.otherparty)) ((st
Csv.GetSample().Rows
|> Seq.groupBy (fun row -> row.STATE,row.INCOME,row.CHILDREN)
|> Seq.map (fun ((state,income,children),data) ->
let pctrepub = data|> Seq.map (fun row -> (100.0 - float row.otherparty))
((state,income,children),pctrepub))
|> List.ofSeq
这是我理想的结果:
(("TX", "51522", "0"), 65.0);
(("AL", "6481", "1"), 51.4);
(("MO", "78921", "1"), 25.1);
(("TN", "12000", "4"), 62.1);
(("PA", "79850", "2"), 41.2);
(("NY", "79215", "1"), 31.0);
(("CA", "79045", "2"), 50.5);
这就是我的结局:
(("TX", "51522", "0"), <seq>);
(("AL", "6481", "1"), <seq>);
(("MO", "78921", "1"), <seq>);
(("TN", "12000", "4"), <seq>);
(("PA", "79850", "2"), <seq>);
(("NY", "79215", "1"), <seq>);
(("CA", "79045", "2"), <seq>);
(“TX”、“51522”、“0”);
(“AL”、“6481”、“1”);
(“MO”、“78921”、“1”);
(“TN”、“12000”、“4”);
(“PA”、“79850”、“2”);
(“纽约”、“79215”、“1”);
(“CA”、“79045”、“2”);
为什么最后一行值显示为
,我如何解决这个问题?元组的最后一个元素是pctrepub
,它是Seq.map
调用的结果,Seq.map
返回一个序列,而不是一个数字。因此,元组的最后一个元素是一个序列,这绝对不足为奇
至于如何解决这个问题,没有足够的信息:我知道您想要获取数字而不是序列,但是您没有说数字应该来自哪里,所以我无法帮助您。元组的最后一个元素是
pctrepub
,这是Seq.map
调用的结果,和Seq.map
返回序列,而不是数字。因此,元组的最后一个元素是一个序列,这绝对不足为奇
至于如何解决这个问题,没有足够的信息:我知道你想得到数字而不是序列,但你没有说数字应该从哪里来,所以我不能帮你。你在其他地方提到你是F#的初学者(八天前开始学习),因此,这里有一个如何阅读F#文档的快速指南,可以帮助您自己回答其中的一些问题。让我们看一看。它列出了许多可以在序列上调用的函数:
append
,average
,averageBy
,filter
,map
,groupBy
。。。它们都有不同的类型签名,每个函数的类型签名是它将做什么的线索。让我们看几个例子:
:average
-返回 顺序seq->^T
:averageBy
-创建一个新集合,其元素是将给定函数应用于集合中每个元素的结果('T->^U)->seq'U)->seq
平均值
,因为它最简单。类型符号中的->
箭头告诉您这是一个函数。输入位于箭头的左侧,输出位于箭头的右侧。因此,类型签名意味着此函数接受seq
,并返回类型为^T
的项。类型名T
前面的^
或'
字符意味着它是一个泛型类型,它将解析为运行代码时实际拥有的任何类型:int、string、tuple等等。因此,T
只是一个占位符名称,表示您实际拥有的任何类型:如果您拥有int,则这是一个seq->int
函数。如果您有字符串,这是一个seq->string
函数,依此类推。(类型前面的^
字符意味着它将在编译时解析,而前面的'
字符意味着它将在运行时解析。在对F#有更多经验之前,您不必担心这种区别,所以现在,只需将其中任何一个作为表示“这是一个泛型类型”)。因此average
函数的类型签名告诉您它接受一系列值并返回单个值
现在,averageBy
。这更复杂。首先,这里有更多的箭头。这与一个名为的概念有关,在链接中对此进行了很好的解释,因此我不会深入讨论。在初学者阶段,您应该将最后一个箭头之后的任何内容都视为函数的输出,其余类型也一样将函数的输入(用箭头隔开)。换句话说,像int->char->string
这样的类型签名应该被理解为“这是一个函数,它接受两个输入,一个int
,一个char
第二个,并返回一个字符串
”
但是你看到averageBy
类型签名中('T->^U)
位周围的括号了吗?这些括号的意思正是它们在数学中的意思:单独阅读这一部分。因此averageBy
的第一个参数是('T->^U)类型的
。averageBy
的第二个参数类型为seq^U)
,它有一个箭头,所以它是一个函数。具体地说,它是一个函数,接受泛型T
的对象,并返回泛型U
的对象。(正如我前面所说的,现在不要担心'
与^
之间的区别)。第二个参数是类型为T
的项目序列,输出类型为U
。该类型签名加上名称,为您提供了函数如何工作的线索:它将查看类型为T
的事情序列,并且对于每一个,它将调用函数将该T
事情转换为类型为U
的对象。然后它返回一个U
值作为输出:从名称中,可以得出结论,它返回的单个值将是'T->^U
函数生成的所有U
值的平均值
因此类型签名('T->^U)->seq(row.STATE,row.INCOME,row.CHILDREN),100.0-float row.otherparty)
你应该得到你想要的结果),所以我不会在这里详细介绍。希望我写这篇文章所花的时间能帮助你更深入地理解事情,这样你就可以在将来回答自己的问题,而不必太依赖于问堆栈溢出问题(然后等待,有时是几个小时,等待答案)。你提到过其他问题