【问题标题】:My function outputs a "Seq" and not a String in F#?我的函数在 F# 中输出“Seq”而不是字符串?
【发布时间】:2018-06-11 08:52:43
【问题描述】:

我很好奇为什么当我运行它时,函数“parsenumber”被输出为一个 Seq 而不仅仅是一个 int。

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

这是结果:

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

如何更改它以输出数字而不是 &lt;seq&gt;

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

原始 CSV 数据:

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

我想要的结果:

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

我实际上得到了什么:

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

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

【问题讨论】:

    标签: f#


    【解决方案1】:

    当您说“我试图跳过每个观察值的前 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) -&gt; 将变为fun ((number : string, income, sex, house), data) -&gt;。所以你的整个Seq.map 表达式会变成:

    |> 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 会更好,但如果我更了解您要做什么,那么可能会有更好的建议。

    【讨论】:

    • 出于某种原因,我仍然收到(&lt;seq&gt;, "30050", "Male", "Yes") (&lt;seq&gt;, "78000", "Female", "No") 我需要 作为我跳过然后占用的数字。你知道为什么没有显示实际数字吗?
    • "...我跳过然后占用的数字"。我不知道你说这些话是什么意思。你能给我一个你所拥有的输入的具体例子,以及你想要得到的结果吗?这可能有助于我更好地理解。
    • 糟糕,我忘记调整示例代码以包含 .Substring 部分。现已修复。
    • 好的,那我是对的,你想要.Substring。再次尝试我的答案中的代码:第一次尝试时,我忘记将您的Seq.skip |&gt; Seq.take 表达式更改为.Substring,因此您再次得到相同的结果也就不足为奇了。 :-)
    • 那么当我使用 Seq.take 时,它​​不是遍历序列吗?是这个问题吗
    猜你喜欢
    • 1970-01-01
    • 2018-03-05
    • 2014-12-14
    • 2020-01-10
    • 2019-11-10
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多