我的函数在F#中输出的是” Seq”而不是字符串?


My function outputs a “Seq” and not a String in F#?

我很好奇为什么在运行此命令时,函数" parsenumber"会作为Seq而不是一个整数输出。

1
2
3
4
|> Seq.map (fun ((number,income,sex,house),data) ->
    let parsenumber = number |> Seq.skip 9 |> Seq.take 5
    let numberofpets = data |> Seq.map (fun row -> (1.0 - float row.pets))
    ((parsenumber,income,sex,house),numberofpets)

这是结果:

1
2
(<seq>,"30050","Male","Yes")
(<seq>,"78000","Female","No")

如何更改此设置,以便它输出数字而不是<seq>

对于Seq.skip和Seq.take,我试图跳过每个观察值的前9个整数,并返回最后5个。

原始CSV数据:

1
2
10000000001452,30050,Male,Yes
10000000001455,78000,Female,No

我想要的结果是:

1
2
('01452','30050','Male','Yes')
('01455','78000','Female','No')

我实际上得到的是:

1
2
(<seq>,"30050","Male","Yes")
(<seq>,"78000","Female","No")

我不需要输出,而是实际数字。


当您说"我试图跳过每个观察值的前9个整数并返回后5个"时,您是说"数字"而不是"整数"吗?即number最初是字符串吗?然后,您应该使用number.Substring(9, 5)而不是Seq.skipSeq.takeSeq.skipSeq.take函数被定义为返回序列,这就是它们的作用。当您将字符串解释为序列时,它将返回字符序列。如果使用.Substring方法,它将返回一个字符串。

顺便说一句,如果要使用.Substring,则需要告诉F#您希望number是什么类型:参数的调用方法是F#的类型推断无法弄清楚哪种类型的地方你有。 (由于理论上的原因,您可以使用.Substring方法定义您自己的类型,并打算调用该类型)。要显式声明number参数的类型,请使用冒号和类型名称,以使fun ((number,income,sex,house),data) ->变为fun ((number : string, income, sex, house), data) ->。因此,您的整个Seq.map表达式将变为:

1
2
3
4
|> Seq.map (fun ((number : string, income, sex, house), data) ->
    let parsenumber = number.Substring(9, 5)
    let numberofpets = data |> Seq.map (fun row -> (1.0 - float row.pets))
    ((parsenumber, income, sex, house), numberofpets)

此外,parsenumber不是函数,因此也不是一个好名字。可能parsednumber会更好,但是如果我对您要尝试做的事情了解得更多,那么可能会有更好的建议。