gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:06:55 27 4
gpt4 key购买 nike

在 F# 中,您可以定义一个 first功能如下:
let first (x, y) = x
你可以这样称呼它:
first (1, 2)
您还可以根据 BCL Tuple 定义相同的函数类型:
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 .您可以看到我对元组的许多重载,但我不想将它们扩展到某个神奇的数字。

最佳答案

我认为您对非常长的元组的观察部分回答了您的问题 - 在 F# 中,您可以拥有任意长度的元组,因此创建一个包含 9 个元素的元组是完全没问题的:

let t = (1,1,1,1,1,1,1,1,1)

如果您使用 t.GetType() 查看运行时类型那么这实际上被编译成一个嵌套的 .NET 元组 Tuple<int, int, int, int, int, int, int, Tuple<int, int>> .

我不确定这是否是确定的答案,但我认为它显示了问题的一部分 - 如果 F# 元组匹配 .NET 元组,那么它们要么必须限制为 8 个元素(以匹配 .NET 元组类型)或者它们将是一个“泄漏”的抽象,并且大元组将(默默地)匹配一些嵌套的元组类型。

如果您需要一个可以处理任意数量元素的函数,那么将参数作为列表而不是元组接受可能更有意义?或者,您可以使用 F# 反射(在 Microsoft.FSharp.Reflection 中)编写一个适用于任意大小元组的函数……但我发现这对解析器很有用,而其他方法可能没有那么好。

关于F# 结构元组与 BCL 元组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21870026/

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