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# 类型提供程序和数据处理 的相关文章

  • Async.TryCancelled 不适用于 Async.RunSynchronously

    我尝试创建一个根据用户交互更新 UI 的代理 如果用户单击按钮 则应刷新 GUI 模型的准备需要很长时间 因此希望如果用户单击其他按钮 则取消准备并开始新的准备 到目前为止我所拥有的 open System Threading type p
  • F# 2010 Seq.generate_using

    Visual Studio 2010 中的 Seq generate using 是否有替代 解决方法 FSharp PowerPack dll 不适用于 2010 AFAIK 很抱歉 2010 年的 PowerPack 尚未上市 我不记得
  • 通用高阶函数

    当我将泛型函数作为本地值传递时 但在作为参数传递时却不能使用具有不同类型参数的泛型函数时 是否有原因 例如 let f id let g x y f x f y g 1 2 工作正常 但如果我尝试将函数作为参数传递 let g f x y
  • 管道序列中的异常处理

    我正在开发一个基本的 2D CAD 引擎 管道操作符显着改进了我的代码 基本上 有几个函数从空间中的点 x y 开始 并在多次移动操作后计算最终位置 let finalPosition startingPosition gt moveByL
  • F# 获取随机数列表

    我正在尝试用随机数填充列表 但很难获得随机数部分 我现在打印出一个随机数 10 次 我想要的是打印出 10 个不同的随机数 let a new System Random Next 1 1000 let listOfSquares for
  • 什么是错误“类型实例化涉及 byref 类型。” F# 中的解决方法是什么

    我有一些代码包装 TA Lib 很多包装器非常相似 let sma timePeriod int data float let mutable outStartIndex 0 let mutable outNbElement 0 let m
  • F# nameof 运算符不是一等函数

    我正在使用 F 4 7
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • 如何使用 FLinq 在 F# 中进行外连接?

    问题几乎说明了一切 我有一个如下形式的大 flinq 查询 for alias1 in table1 do for alias2 in table2 do if alias1 Id alias2 foreignId 使用这种形式 如何在这两
  • F# 中的数组初始化

    如何根据给定的记录类型在 F 中创建和初始化数组 假设我想创建一个包含 100 个 record1 记录的数组 e g type record1 value1 string value2 string let myArray Array i
  • 在 F# 类型提供程序中发出生成的类型

    我创建了一个简单的生成类型提供程序 它采用重新组织类型的程序集的路径 将它们置于类型提供程序命名空间下 如果您愿意 可以说是内部化 相关代码的链接在这里https github com colinbull Playground https
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是
  • 如何编写一个计算表达式生成器来累积值并允许标准语言构造?

    我有一个计算表达式生成器 可以随时生成值 并且有许多自定义操作 但是 它不允许标准 F 语言构造 并且我在弄清楚如何添加此支持方面遇到了很多麻烦 举一个独立的例子 下面是一个非常简单且毫无意义的构建 F 列表的计算表达式 type Item
  • 如何从引用的表达式匹配中获取模块、函数等的 F# 名称

    我继续开发 F 引用表达式的打印机 它不一定是完美的 但我想看看有什么可能 中的活跃模式Microsoft FSharp Quotations Patterns and Microsoft FSharp Quotations Derived
  • F# 引用的另一个限制?

    今天早些时候 我遇到了 F 引用的限制 并在这里提出了一个问题 F 引号 变量可能会转义作用域 https stackoverflow com questions 6414185 f quotations variable may esca
  • obj[] 和 string[] 作为参数

    我在用Microsoft FSharp Reflection FSharpValue MakeUnion这需要一个Reflection UnionCaseInfo and an obj 可以为空 作为参数 但是 我得到了Type misma
  • 基于函数签名的模式匹配

    在 F 中 您可以对函数签名进行模式匹配 我想用一个函数来装饰多个函数 该函数测量函数的执行情况并调用 statsd 我当前的功能是 let WrapFunctionWithPrefix metrics Metric Client IRec
  • 如何忽略异步块中异步函数的返回值?

    The m1 and m2以下函数中存在编译错误 let m p async return p 2 let m1 async do m 2 ERR was expected int but here has type unit let m2
  • 使用 FParsec 解析 int 或 float

    我正在尝试使用 FParsec 解析文件 该文件由 float 或 int 值组成 我面临两个问题 无法找到好的解决方案 1 Both pint32 and pfloat将成功解析相同的字符串 但给出不同的答案 例如pint32将返回3解析
  • 在构建过程中引用自身内部的记录

    我正在尝试创建一条记录 该记录在同一构造函数中使用先前定义的字段之一来计算另一个字段的值 例如 myRecordType Foo int Bar int myRecord Foo 5 Bar Array init Foo fun i gt

随机推荐