gpt4 book ai didi

f# - 将元组序列写入 csv 文件 f#

转载 作者:行者123 更新时间:2023-12-02 05:33:50 25 4
gpt4 key购买 nike

我正在尝试将一系列元组写入 csv,但正常的 File.WriteAllLines 被一系列元组重载。

因此,我尝试将元组展平为字符串序列。

这是我的代码:-

open System;;
open Microsoft.FSharp.Reflection;;

let tupleToString (t: string * float) =
if FSharpType.IsTuple(t.GetType())
then String.Format("{0},{1}", fst t, snd t)
else "";;

let testTuple = ("monkey", 15.168);;

tupleToString(testTuple);;

let testSeqTuple = [("monkey", 15.168); ("donkey", 12.980)];;

let allIsStrings (t:seq<string * float>) = Seq.collect tupleToString t;;

allIsStrings(testSeqTuple);;

当我只对一个元组使用“tupleToString”时,结果很好。

但是 allIsStrings 的 Seq.collect 部分返回按字符分解的元组。

我也尝试过 Seq.choose 和 Seq.fold,但它们只会抛出错误。

谁能建议我应该使用 sequence 模块中的哪个函数 - 或者建议 File.WriteAllLines 的替代方法,该方法适用于元组?

最佳答案

您需要使用Seq.map 将列表的所有元素转换为string,然后使用Array.ofSeq 获取一个数组你可以传递给 WriteAllLines:

let allIsStrings (t:seq<string * float>) = 
t |> Seq.map tupleToString
|> Array.ofSeq

此外,在您的 tupleToString 函数中,您不需要使用反射来检查参数是否为元组。它总是一个元组,因为这是由类型系统保证的。所以你可以写:

let tupleToString (t: string * float) = 
String.Format("{0},{1}", fst t, snd t)

如果您希望对具有任意数量参数的元组进行这项工作,您可以使用反射(但这是一个更高级的主题)。以下获取元组的元素,将它们全部转换为字符串,然后使用逗号连接它们:

let tupleToString t = 
if FSharpType.IsTuple(t.GetType()) then
FSharpValue.GetTupleFields(t)
|> Array.map string
|> String.concat ", "
else failwith "not a tuple!"

// This works with tuples that have any number of elements
tupleToString (1,2,"hi")
tupleToString (1.14,2.24)

// But you can also call it with non-tuple and it fails
tupleToString (new System.Random())

关于f# - 将元组序列写入 csv 文件 f#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com