类型提供程序可以作为参数传递给函数吗

2024-01-01

我正在学习 F# 和FSharp.数据库 http://fsharp.github.io/FSharp.Data/。我有一个任务需要读取 20 个 CSV 文件。每个文件都有不同数量的列,但记录具有相同的性质:以日期字符串为键,所有其余列都是浮点数。在将结果保存到数据库之前,我需要对浮点格式数据列进行一些统计计算。尽管我让所有管道逻辑都正常工作:

  • 通过 FSharp.Data CSV 类型提供程序读取 CSV,
  • 使用反射来获取每个列字段的类型以及将它们输入到模式匹配中的标题名称,这决定了相关的计算逻辑
  • sqlbulkcopy 结果),我结束了 20 个函数(每个 CSV 文件 1 个)。

这个解决方案远不能被接受。我想我可以创建一个通用的顶级函数作为驱动程序来循环所有文件。然而,经过几天的尝试,我一无所获。

FSharp.Data CSV 类型提供程序具有以下模式:

type Stocks = CsvProvider<"../docs/MSFT.csv">
let msft = Stocks.Load("http://ichart.finance.yahoo.com/table.csv?s=MSFT")
msft.Data |> Seq.map(fun row -> do something with row)
...

我努力了:

let mainfunc (typefile:string) (datafile:string) =
    let msft = CsvProvider<typefile>.Load(datafile)
    ....

这不起作用,因为 CsvProvider 抱怨类型文件不是有效的常量表达式。我猜测类型提供者必须需要该文件来在编码时推断出列的类型,类型推断不能推迟到使用相关信息调用 mainfunc 的代码。

然后我尝试将类型作为参数传递给 mainfunc

neither

let mainfunc (typeProvider:CsvProvider<"../docs/MSFT.csv">) =
    ....

nor

let mainfunc<typeProvider:CsvProvider<"../docs/MSFT.csv">> =
    ....

worked.

然后我尝试通过 MSFT

type Stocks = CsvProvider<"../docs/MSFT.csv">
let msft = Stocks.Load("http://ichart.finance.yahoo.com/table.csv?s=MSFT")

进入 mainFunc。根据情报,MSFT 有一种类型CsvProvider<...>MSFT.Data 的类型为seq<CsvProvider<...>>。我试图用这两个显式类型声明一个输入参数,但它们都无法通过编译。

有人可以帮忙并指出我正确的方向吗?我在这里错过了一些基本的东西吗?任何 .net 类型和类对象都可以在 F# 函数中使用来显式指定参数类型,但我可以对类型提供程序中的类型执行相同的操作吗?

如果上述问题的答案是否定的,那么有什么替代方案可以使逻辑通用以处理 20 个文件甚至 200 个不同的文件?


这与使用 F# TypeProvider 类型的类型注释,例如FSharp.Data.JsonProvider.DomainTypes.Url https://stackoverflow.com/questions/21402829/type-annotation-for-using-a-f-typeprovider-type-e-g-fsharp-data-jsonprovider/

即使智能感知告诉你CsvProvider<...>,参考msft输入您必须使用的类型注释Stocks,并且对于msft.Data, 代替CsvProvider<...>.Row,你必须使用Stocks.Row.

如果你想做一些动态的事情,你可以使用以下命令获取列名称msft.Headers你可以使用获取列的类型Microsoft.FSharp.Reflection.FSharpType.GetTupleElements(typeof<Stocks.Row>)(这是有效的,因为该行在运行时被删除为元组)

EDIT:

如果格式不兼容,并且您正在处理不符合通用格式的动态数据,您可能需要使用CsvFile反而 (http://fsharp.github.io/FSharp.Data/library/CsvFile.html http://fsharp.github.io/FSharp.Data/library/CsvFile.html),但是您将失去类型提供者的所有类型安全性。您也可以考虑使用 Deedle 代替(http://bluemountaincapital.github.io/Deedle/ http://bluemountaincapital.github.io/Deedle/)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型提供程序可以作为参数传递给函数吗 的相关文章

  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • F# 尝试处理未处理的异常

    在下面的代码中 我想读取一个文件并返回所有行 如果存在 IO 错误 我希望程序退出并将错误消息打印到控制台 但程序仍然遇到未处理的异常 对此的最佳实践是什么 我想我不需要Some None因为无论如何我都希望程序在错误时退出 谢谢 let
  • 带表达式的 F# 类型定义

    是否可以这样表达 type id int gt 0 我知道它不可能静态执行 因为这意味着 F 具有依赖类型 在 C 中 我习惯于使用代码契约来执行此类操作并获得运行时强制执行 我正在这里寻找类似的东西 Thanks 编辑 感谢您提供的所有答
  • 如何编写强制执行复杂模式的 F# 类型提供程序?

    就在最近 我处理了一些交通和旅行信息的数据 即数据Datex2 http www datex2 eu content datex ii xml schema 21格式 该项目时间不长 现在已经结束 我像往常一样继续生成了一堆强类型 C 类x
  • obj[] 和 string[] 作为参数

    我在用Microsoft FSharp Reflection FSharpValue MakeUnion这需要一个Reflection UnionCaseInfo and an obj 可以为空 作为参数 但是 我得到了Type misma
  • 如何从 C# 调用 F# 类型扩展(静态成员函数)

    FSharp 代码的结构如下 我无法控制源代码 namespace FS
  • 从函数返回随机值是副作用吗?

    我当时正在编写一些 F 代码 并且正在编写一个从一组字符串中返回随机字符串的函数 假设我有这样的事情 open System let a a b c d let rstring arr string let r new Random arr
  • 如何从 f# 返回一个空元组到 c#? [复制]

    这个问题在这里已经有答案了 我有这个类型正确的 C 函数 static System Tuple
  • 从静态成员访问 let 绑定字段

    有没有办法从静态成员访问 let 绑定字段 下面给出了指示的错误 type Foo x let x x static member test let foo Foo System DateTime Now Month printfn A f
  • 如何为 Azure Function 启用“始终开启”功能?

    我有一个具有 3 个功能的功能应用程序 其中一个功能每 2 分钟定时器触发一次 我观察到 过了一会儿 该功能停止被触发 但当我进入门户时又重新启动 据我了解 原因是默认情况下 始终开启 处于关闭状态 但是 当我进入应用程序设置 常规设置时
  • 如何在 F# 中打印整个列表?

    当我使用 Console WriteLine 打印列表时 它默认仅显示前三个元素 如何让它打印列表的全部内容 您可以将 A 格式说明符与 printf 一起使用来获得 美化的 列表打印输出 但与对象上的 Console WriteLine
  • 如果目标是 x64,为什么 Seq.iter 比 for 循环快 2 倍?

    免责声明 这是微基准测试 如果您对此主题感到不满意 请不要评论诸如 过早优化是邪恶的 之类的言论 示例是针对 x64 Net4 5 Visual Studio 2012 F 3 0 的发行版 并在 Windows 7 x64 中运行 经过分
  • F#:Microsoft.FSharp.Data.TypeProviders 是否需要配置文件 47?

    这是后续我昨天的帖子 https stackoverflow com questions 30399773 f fsc error fs2024 static linking may not use assembly that target
  • 您将如何在 F# 中解决这个问题? (高频传感器数据)

    我是一名机械工程研究生 我的导师刚刚要求我为我们的一个传感器项目编写一个数据可视化实用程序 由于现在是夏天 他希望我能从中获得一些乐趣 我认为这将是学习一门擅长科学计算的语言的好时机 所以我直接开始学习 F 由于我是函数式编程范例的新手 因
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • 使用列表匹配绑定值(没有编译器警告)

    假设我有一个需要一些时间的函数int参数 但在其中我将使用float32 我不想使用float32 i无处不在的功能 相反 我想这样做 let x float32 x let y float32 y let w float32 w let
  • 我应该强制使用 F# 测量单位的类型吗? [风格与一般性]

    这个问题与 F 相关计量单位 https learn microsoft com en us dotnet fsharp language reference units of measure 我应该为我正在使用的单元强制执行类型吗 例如
  • 我可以提供类型作为 F# 中类型提供程序的输入吗?

    这样做有什么我应该注意的陷阱吗 您知道处理我可能遇到的相同 pb 的现有代码吗 Thks 不幸的是 您无法将类型作为静态参数传递给类型提供程序 使用传递的静态参数MyProvider lt first argument 42 gt 必须是原
  • 使用部分函数短路列表映射

    因此 我创建了一个名为 tryMap 的函数 如下所示 tryMap with failure and success continuations let rec tryMapC R gt U list gt R gt T gt U opt
  • F# - 构造嵌套类型

    我想这是非常基本的 F 问题 类型有 type Id1 Id1 of int type Id2 Id2 of string type Id Id1 Id2 type Child Id Id Smth string list type Nod

随机推荐