为什么输出是<;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)
你应该得到你想要的结果),所以我不会在这里详细介绍。希望我写这篇文章所花的时间能帮助你更深入地理解事情,这样你就可以在将来回答自己的问题,而不必太依赖于问堆栈溢出问题(然后等待,有时是几个小时,等待答案)。

你提到过其他问题