F# 结构元组与 BCL 元组类型

2023-12-26

在 F# 中你可以定义一个first函数如下:

let first (x, y) = x

你可以这样称呼它:

first (1, 2)

您还可以根据 BCL 定义相同的函数Tuple type:

let first (t:Tuple<_, _ >) = t.Item1

但是,您不能使用先前的语法来调用它,否则您将收到以下错误:

error FS0001: The type ''c * 'd' is not compatible with the type 'Tuple<'a,'b>'

相反,您必须执行以下操作:

first (Tuple<_,_>(1, 2))

这很奇怪,因为编译后的 F# 代码似乎确实使用了Tuple来表示任一情况下的参数。那么为什么 F# 编译器告诉我类型不兼容?

为什么这很重要?好吧,基本上我想编写一个具有支持任意长度元组的重载的方法。这对于 F# 的语法元组来说是不可能的,因为必须提前知道参数的确切数量。然而,使用 BCL 似乎确实可行Tuple类型,因为它们使用TRest允许任意长度的元组的技巧。不幸的是,如果我以这种方式编写重载,那么它们将无法与 F# 语法元组一起使用,而这是最终目标。

所以我的问题是:为什么句法元组和 BCL 元组不兼容?另外,是否有编写在 F# 中对任意长度元组进行操作的函数和/或方法的示例?

具体的应用程序涉及我正在编写的基于类型推断的二进制解析库。你可以查看代码here https://github.com/lasandell/Finary/。您可以看到我对元组有许多重载,但我不想将它们扩展到某个神奇的数字。


像往常一样,F# 规范来救援:

6.3.2 元组表达式

expr1, ..., exprn 形式的表达式是元组表达式。例如:

let three = (1,2,"3")
let blastoff = (10,9,8,7,6,5,4,3,2,1,0)

对于新类型 ty1 ... tyn,表达式的类型为 (ty1 * ... * tyn),并且使用初始类型 tyi 检查每个单独的表达式 ei。

元组类型和表达式被转换为名为 System.Tuple 的 F# 库类型系列的应用程序。元组类型 ty1 * ... * tyn 翻译如下:

  • 对于 n Tuple<ty1,...,tyn>.
  • 对于较大的 n,元组类型是附加 F# 库类型的应用程序的简写System.Tuple<_>如下:
  • 对于 n = 8,详细形式为Tuple<ty1,...,ty7,Tuple<ty8>>.
  • 对于 9 Tuple<ty1,...,ty7,tyB>其中 tyB 是类型的转换形式 (ty8... tyn).

元组表达式 (expr1,...,exprn) 翻译如下:

  • 对于 n new Tuple<ty1,…,tyn>(expr1,...,exprn).
  • 对于 n = 8 的详细形式new Tuple<ty1,…,ty7,Tuple<ty8>>(expr1,...,expr7, new Tuple<ty8>(expr8).
  • 对于 9 new Tuple<ty1,...ty7,ty8n>(expr1,..., expr7, new ty8n(e8n)其中 ty8n 是类型 (ty8*...* tyn),expr8n 是表达式的详细形式 expr8,...,exprn。

当被视为静态类型时,元组类型与其编码形式不同。但是,元组值和类型的编码形式在 F# 类型系统中通过运行时类型可见。例如,typeof 相当于typeof<System.Tuple<int,int>>,并且 (1,2) 具有运行时类型System.Tuple<int,int>。同样,(1,2,3,4,5,6,7,8,9) 具有运行时类型Tuple<int,int,int,int,int,int,int,Tuple<int,int>>.

注意:在 .NET 4.0 F# 中将元组添加到 BCL 之前,使用 FSharp.Core dll 中定义的 System.Tuple 类型

我想您处理任意大小的元组的唯一方法是使用以下函数进行构造和解构:Microsoft.FSharp.Reflection.FSharpType\FSharpValue

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

F# 结构元组与 BCL 元组类型 的相关文章

  • 如何从复合泛型类型中检索值?

    如何从泛型中检索值 具体来说 我正在尝试以下操作 Test let result Validate goodInput How to access record let request getRequest result 这是代码 type
  • .NET 4 自旋锁

    以下测试代码 F 未返回我期望的结果 let safeCount let n 1000000 let counter ref 0 let spinlock ref lt SpinLock false let run i0 i1 for i
  • F# 中的异步 EF 查询

    在使用 EF6 的 C 中 我可以轻松地进行如下异步操作 using var context new MyDbContext var item await context SomeEntities Where e gt e Id 1 Fir
  • 如何使用 printf 自定义自定义类型的输出?

    我已经阅读了很多内容专家 F 并正在致力于构建一个实际的应用程序 在调试时 我已经习惯了传递这样的 fsi 命令 以使 repl 窗口中的内容清晰可见 fsi AddPrinter fun x myType gt myType ToStri
  • 如何在 x 轴上显示每个元素的标签?

    我有包含文件名和编号的元组序列 我想绘制柱形图 其中 X 轴上有文件名 我的问题是现在 X 轴下仅显示 3 个标签 文件名 这可能是因为屏幕无法容纳更多内容 还是X轴间隔错误 如何让图表显示所有文件名 也许有办法将这些标签逆时针旋转 90
  • 双前向/后向管道操作符是否有记录?

    我记得读过有关双管道运算符的内容 gt 和 Example let print a b sprintf O O a b 1 2 gt print val it string 1 2 双 向前 向后 管道运算符记录在以下列表中MSDN 上的
  • 对 null/空值使用 bool.Parse 时出错

    我有一个使用管道运算符的表达式 该表达式将值转换为字符串 然后转换为布尔值 但有时原始值可能为空 当值为 null 时 如何使用模式匹配或其他方式假设 false type kv Dictionary
  • F#、FParsec 和递归调用流解析器(第二次)

    感谢您的回复我的第一篇文章 https stackoverflow com questions 26853718 f fparsec and calling a stream parser recursively and 我的第二篇文章 h
  • 如何更改 Rx Builder 实现来修复堆栈溢出异常?

    我正在尝试提出一个 Rx Builder 以在 F 计算表达式语法中使用反应式扩展 我该如何修复它 以免堆栈崩溃 就像下面的 Seq 例子一样 是否有计划提供 RxBuilder 的实现作为响应式扩展的一部分或作为 NET Framewor
  • 通用高阶函数

    当我将泛型函数作为本地值传递时 但在作为参数传递时却不能使用具有不同类型参数的泛型函数时 是否有原因 例如 let f id let g x y f x f y g 1 2 工作正常 但如果我尝试将函数作为参数传递 let g f x y
  • 如何在 F# 中捕获任何异常(System.Exception)而不发出警告?

    我试图捕获异常 但编译器给出警告 此类型测试或向下转型将始终保持 let testFail try printfn Ready for failing failwith Fails with System ArgumentException
  • 管道序列中的异常处理

    我正在开发一个基本的 2D CAD 引擎 管道操作符显着改进了我的代码 基本上 有几个函数从空间中的点 x y 开始 并在多次移动操作后计算最终位置 let finalPosition startingPosition gt moveByL
  • 将 C# 代码转换为 F#(if 语句)

    我想知道如何转换此代码逐行从 C 到 F 我不想使用任何类型的 F 习惯用法或类似的东西 我想了解如何直接映射C 的构造到 F 这是 C 代码 requires l Length gt 0 int GetMinimumValue List
  • 从 F# 调用 Newtonsoft.Json 出现意外结果

    我没有从该 F 代码中获得预期结果 我希望 t 包含调用 JsonSchema Parse json 的结果 但它是空的 我究竟做错了什么 open Newtonsoft Json open Newtonsoft Json Schema l
  • 在 F# 类型提供程序中发出生成的类型

    我创建了一个简单的生成类型提供程序 它采用重新组织类型的程序集的路径 将它们置于类型提供程序命名空间下 如果您愿意 可以说是内部化 相关代码的链接在这里https github com colinbull Playground https
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是
  • 如何使用 .Net Core 和 VSCode 在调试模式下执行测试?

    如何使用 Net Core 和 VSCode 在调试模式下执行测试 我当前正在命令行上运行以下命令 dotnet Test 但是 这不是在调试模式下执行测试 我要附加调试器吗 如果是这样 怎么办 如有必要 请将测试项目转换为控制台应用程序
  • 如何使 FSI 在 NET5 下工作并让愚蠢的 stackoverflow 消息“标题不能包含...”闭嘴?

    我正在将一个相当小的 F 项目从 Net Framework 迁移到 NET5 迁移非常简单 一切正常 包括测试 但是 当我运行一些脚本时 我现在收到以下错误 Microsoft R F Interactive version 11 0 0
  • 如何编写一个计算表达式生成器来累积值并允许标准语言构造?

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

随机推荐

  • SignalR 连接挂起,大约 30 秒后调用客户端

    我用的是最新的SignalR来自 MVC4 站点中的 NuGet 使用示例集线器代码 https github com SignalR SignalR wiki QuickStart Hubs 或任何代码 我遇到一些奇怪的连接问题 一切加载
  • 如何复制超链接到emacs?

    是否可以将带有超链接的文本从外部文件 例如 word doc 文件 复制到 Emacs 并保留超链接 如果我将一篇包含 100 个超链接的文章从 Word 复制到 Emacs 并且必须重新输入每个超链接 这可能会非常烦人 这样的功能似乎在普
  • eclipse CSS 文件格式

    我正在尝试按照我的方式制作 eclipse 格式的 css 文件 目前我有这样的东西 class display none sth other 但我想让它像这样 class display none sth other 我可以这样做吗 我只
  • SQL - 查找最接近当前日期的日期

    我的 SQL 查询遇到一些问题 我得到了这张表 insert into Table1 date personssn insert 2012 01 21 12 01 33 123456789 insert into Table1 date p
  • 在 JSF 2.0 中混合 Ajax 和完整请求

    给我带来问题的 JSF 代码如下
  • 我应该尝试在 Java 中创建可逆枚举还是有更好的方法?

    我似乎已经多次遇到这个问题 我想问问社区我是否只是找错了树 基本上我的问题可以归结为 如果我有一个枚举 在Java中 其值很重要 我应该使用枚举还是有更好的方法 如果我确实使用枚举那么什么是反向查找的最佳方法吗 这是一个例子 假设我想创建一
  • Neo4j 中所有节点/关系的可靠(自动)递增标识符

    我正在寻找一种方法 基于递增计数器 不是大而长的 uuid 为 Neo4j 中的所有节点 关系生成唯一标识符 众所周知 Neo4j 引擎维护的内部 ID 不如外部引用可靠 一个接近的解决方案是这个问题中提出的代码 https stackov
  • 在 React JSX 中选择性地渲染可选组件属性

    我有一个用例 其中有一个图像组件 该组件具有必需的 src 属性和可选的 link 属性 如下所示 var Image React createClass propTypes link React PropTypes string even
  • Firebase snapshot.key 未返回实际密钥?

    我有一个根据用户 ID 搜索用户的查询 usersRef queryOrderedByChild email queryEqualToValue email observeEventType Value withBlock snapshot
  • 是否可以将 will_paginate 与 GROUP BY 一起使用?

    我有一个巨大的数据库 我想通过使用 will paginate 来减少查询响应时间 我试图按列对条目进行分组 然后使用 will paginate 将结果放入不同的页面 我尝试这样做 list Persons find by sql sel
  • 如何在Python中将异构列表扁平化为单个列表? [复制]

    这个问题在这里已经有答案了 我有一个对象列表 其中对象可以是列表或标量 我想要一个只有标量的扁平列表 例如 L 35 53 525 6743 64 63 743 754 757 outputList 35 53 525 6743 64 63
  • Perl 正则表达式限制的解决方法?

    我编写了一个程序来从邮件文件夹中提取附件 GITHUB https github com barrycarter bcapps blob master bc extract attachments pl 但由于 Perl 对正则表达式匹配的
  • Angular 2 AOT 构建错误 - JavaScript 堆内存不足

    我的 Angular 2 应用程序是由angular2 webpack 启动器 https www npmjs com package angular2 webpack starter 当我运行命令时npm run build aot构建A
  • pandas 上的数据框划分系列

    我需要划分矩阵的每一列df1进入矩阵的单列df2 得到一个有维数的矩阵df1 3 2 我需要一个结果 dataframe 1 6 2 7 3 8 3 6 4 7 5 8 df1 pd DataFrame data 1 2 3 3 4 5 i
  • 在批处理文件中逐行读取txt

    这是我的问题 我有一个 txt 文件 其中包含 100 个不同的视频名称 示例 abc mpg def mpg ghi mpg xyz mpg 我想使用一些命令逐一处理这些视频 并将结果放入同名的文件夹中 不带扩展名 command1 ab
  • 收集硬币并添加到 Sprite Kit 中的分数标签

    我正在尝试使用本教程作为参考 在我的游戏中实现一个简单的评分系统 http www raywenderlich com 87232 make game like mega jump sprite kit swift part 2 http
  • TagLib Sharp 不编辑艺术家

    我正在尝试将新的艺术家和标题 id3 标签保存到曲目中 从曲目加载标签工作正常 编辑曲目标题也工作正常 但是当我尝试编辑时演员 artist 它没有改变任何东西 这是代码 public void renameID3 string artis
  • 由于弃用而替换 self->isa

    我刚刚安装了 Xcode 4 6 现在我管理的古老代码中出现了新错误 编译器抱怨 直接访问 Objective C 的 isa 已被弃用 取而代之的是 object setClass 和 object getClass 并且该项目将无法构建
  • 如果 Vue 3 引用是对象的属性,则它们的行为会有所不同

    使用 Vue 3 的 Composition API 时 我注意到模板内部的引用在作为对象的属性进行访问时的行为有所不同 我认为这是最好的总结SFC Playground 中的这个示例 https sfc vuejs org eyJBcHA
  • F# 结构元组与 BCL 元组类型

    在 F 中你可以定义一个first函数如下 let first x y x 你可以这样称呼它 first 1 2 您还可以根据 BCL 定义相同的函数Tuple type let first t Tuple lt gt t Item1 但是