F# 类型提供程序和数据处理

2024-04-05

在上一个问题中(使用静态类型语言处理异构数据 https://stackoverflow.com/questions/1798920/working-with-heterogenous-data-in-a-statically-typed-language-f),我询问了 F# 如何处理数据分析中的标准任务,例如操作非类型化 CSV 文件。动态语言擅长执行基本任务,例如

data = load('income.csv')
data.log_income = log(income)

在 F# 中,最优雅的方法似乎是问号 (?) 运算符。不幸的是,在这个过程中,我们失去了静态类型,并且仍然需要类型注释。

F# 未来最令人兴奋的功能之一是类型提供者 http://strangelights.com/blog/archive/2010/11/15/the-future-of-f-type-providers.aspx。在类型安全性损失最小的情况下,CSV 类型提供程序可以通过动态检查文件来提供类型。

但数据分析通常并不止于此。我们经常通过操作管道转换数据并创建新的数据集。我的问题是,如果我们主要操作数据,类型提供程序可以提供帮助吗?例如:

open CSV // Type provider
let data = CSV(file='income.csv') // Type provider magic (syntax?)
let log_income = log(data.income) // works!

这可以工作,但会污染全局名称空间。考虑添加列通常比创建新变量更自然。有什么办法可以做吗?

let data.logIncome = log(data.income) // won't work, sadly.

当目标是创建新的衍生数据集或清理数据集时,类型提供程序是否提供了使用 (?) 运算符的方法?

也许是这样的:

let newdata = colBind data {logIncome = log(data.income)}  // ugly, does it work?

还有其他想法吗?


简短的答案是否定的,详细的答案是肯定的(但你不会喜欢这个结果)。要记住的关键是F# 是一种静态类型语言,句号.

对于您提供的代码,newData 具有什么类型?如果无法在编译时确定它,那么您需要诉诸于 Obj 的转换。

// newdata MUST have a static type, even if obj
let newdata = colBind data {logIncome = log(data.income)}  

想象一下 cBind 有以下签名:

val colBind: Thingey<'a> -> 'b -> Thingey2<'a, 'b>

这实际上在某种程度上是有效的,但它不会普遍有效。因为最终您需要一个在编译时不存在的类型。

F# 类型提供程序允许您静态类型源自标准编译时环境外部的数据。然而,类型仍然是静态的。无法在运行时动态更改这些类型*。

*您可以使用恶作剧在运行时修改对象,例如动态对象 http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx。然而,一旦你 开始沿着你失去的那条路走下去 静态类型的所有好处 语言,例如智能感知。 (这是首先使用 F# 的主要原因。)

从概念上讲,您想要做的事情很简单。这系统.数据.数据表 http://msdn.microsoft.com/en-us/library/system.data.datatable.aspxtype 已经具有存储表格数据的概念,并且能够动态添加列。但由于添加列的类型信息在编译时未知,因此存储在这些列中的内容必须被视为 Obj 并在运行时进行转换。

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

F# 类型提供程序和数据处理 的相关文章

  • 将 F# 类型保存到数据库

    A lot http gorodinski com blog 2013 02 17 domain driven design with fsharp and eventstore f 文章数推荐 http fsharpforfunandpr
  • F# 尝试处理未处理的异常

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

    的文档leftOuterJoin MSDN 上的查询表达式 http msdn microsoft com en us library hh225374 aspx通过样本反复暗示 当使用leftOuterJoin on into 你仍然必须
  • 如何编写一个计算表达式生成器来累积值并允许标准语言构造?

    我有一个计算表达式生成器 可以随时生成值 并且有许多自定义操作 但是 它不允许标准 F 语言构造 并且我在弄清楚如何添加此支持方面遇到了很多麻烦 举一个独立的例子 下面是一个非常简单且毫无意义的构建 F 列表的计算表达式 type Item
  • 使用不区分大小写的比较从集合中减去记录

    我有一组记录 type Person Name string Age int let oldPeople set Name The Doctor Age 1500 Name Yoda Age 900 与上面的硬编码示例不同 这组数据实际上来
  • 像 Javascript 对象一样循环遍历 F# 记录

    在 javascript 中 我可以使用简单的 for 循环访问对象的每个属性 如下所示 var myObj x 1 y 2 var i sum 0 for i in myObj sum sum myObj i 我想知道我是否可以用 F 做
  • F# 引用的另一个限制?

    今天早些时候 我遇到了 F 引用的限制 并在这里提出了一个问题 F 引号 变量可能会转义作用域 https stackoverflow com questions 6414185 f quotations variable may esca
  • F# 静态成员类型约束

    我正在尝试定义一个函数 factorize 它使用类似于 Seq sum 的结构类型约束 需要静态成员 Zero One 和 以便它可以与 int long bigint 等一起使用 似乎无法获得正确的语法 并且无法找到有关该主题的大量资源
  • F# 匹配 ->

    我想做类似的东西 Nemerle 语法 def something match STT 1 with st Summ 2 with st AVG gt st summbycol counter STT 在 F 上 那么 F 是真的吗 没有对
  • 从静态成员访问 let 绑定字段

    有没有办法从静态成员访问 let 绑定字段 下面给出了指示的错误 type Foo x let x x static member test let foo Foo System DateTime Now Month printfn A f
  • 生成尾调用操作码

    出于好奇 我尝试使用 C 生成尾部调用操作码 斐波那契数很简单 所以我的 C 示例如下所示 private static void Main string args Console WriteLine Fib int MaxValue 0
  • 具有异步操作的面向铁路的编程

    以前问过类似的问题 但不知何故我没有找到出路 再次尝试另一个例子 作为起点的代码 稍作修改 可在https ideone com zkQcIU https ideone com zkQcIU 它有一些识别问题Microsoft FSharp
  • 使用反射创建 Action<'T> 的实例

    我将如何创建一个实例Action lt T gt 使用反射 这是我所拥有的 let makeAction typ Type f T gt unit let actionType typedefof
  • 函数式编程是否避免了状态?

    根据维基百科 http en wikipedia org wiki Functional programming 函数式编程是一种编程范式 它将计算视为数学函数的评估避免状态和可变数据 强调我的 这是真的吗 我个人的理解是 它使状态更加明确
  • 如何在 F# 中使用 LINQ 更新数据库中的表?

    我看过很多有关如何查询数据库的示例 但没有看到有关如何更新记录的示例 下面是我编写的用于检索表的简单代码 但有人可以解释一下如何修改字段 例如lastActiveDate 并更新数据库上的表 谢谢你 周日 open System open
  • 是否可以在 F# 类型提供程序中使用 System.Type 作为静态参数?

    我想知道是否可以使用 System Type 作为 F 类型提供程序中的静态参数 以便我可以编写如下内容 type HelperType HelperProvider
  • 我应该强制使用 F# 测量单位的类型吗? [风格与一般性]

    这个问题与 F 相关计量单位 https learn microsoft com en us dotnet fsharp language reference units of measure 我应该为我正在使用的单元强制执行类型吗 例如
  • 使用异步工作流程并行化的最佳实践

    假设我想抓取一个网页并提取一些数据 我很可能会写这样的东西 let getAllHyperlinks url string async let req WebRequest Create url let rsp req GetRespons
  • 如何在 F# 中执行 Seq.takeWhile + 一项

    我想编写一个使用谓词过滤序列的函数 但结果还应该包括谓词返回 false 的第一个项目 如果 F 中有一个break关键字 逻辑将是这样的 let myFilter predicate s seq for item in s do yiel
  • F# 会自动内联一些函数,即使它们没有标记为“inline”,这是有意的吗?

    看起来 F 会自动内联一些函数 即使它们没有标记为 内联 let a x x 3 let b x x x let funB x y if x gt y then 3 else 1 let funC x let s a x let c fun

随机推荐