【发布时间】:2014-03-19 03:59:00
【问题描述】:
在 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# base-class-library