在System.Tuple<'T1, 'T2>
该内部表示式(2元件)在F#元组实际上已经具有特性Item1
和Item2
,但这些是由F#编译器隐藏.将扩展成员添加到元组的一种显而易见的方法不起作用,所以我不希望这会起作用(但可能有一些我不知道的解决方法).
一般来说,我认为模式匹配优选成员,如Item1
,Item2
等.(和C#3.0程序员元组:-)工作时经常请模式匹配的支持).
原因是模式匹配迫使您命名.比较这两个代码段:
let (width, height) = tuple
width * height
Run Code Online (Sandbox Code Playgroud)
和使用属性的版本:
tuple.Item1 * tuple.Item2
Run Code Online (Sandbox Code Playgroud)
第二个是更短,但绝对不太可读.
小智 3
不完美,但我正在使用这个。(我借用了http://www.fssnip.net/6V的原始代码并添加了一些小修改。)
[<AutoOpen>]
module TupleExtensions =
type System.Tuple with
static member Item1(t) = let (x,_) = t in x
static member Item1(t) = let (x,_,_) = t in x
static member Item1(t) = let (x,_,_,_) = t in x
static member Item1(t) = let (x,_,_,_,_) = t in x
static member Item1(t) = let (x,_,_,_,_,_) = t in x
static member Item1(t) = let (x,_,_,_,_,_,_) = t in x
static member Item2(t) = let (_,x) = t in x
static member Item2(t) = let (_,x,_) = t in x
static member Item2(t) = let (_,x,_,_) = t in x
static member Item2(t) = let (_,x,_,_,_) = t in x
static member Item2(t) = let (_,x,_,_,_,_) = t in x
static member Item2(t) = let (_,x,_,_,_,_,_) = t in x
static member Item3(t) = let (_,_,x) = t in x
static member Item3(t) = let (_,_,x,_) = t in x
static member Item3(t) = let (_,_,x,_,_) = t in x
static member Item3(t) = let (_,_,x,_,_,_) = t in x
static member Item3(t) = let (_,_,x,_,_,_,_) = t in x
static member Item4(t) = let (_,_,_,x) = t in x
static member Item4(t) = let (_,_,_,x,_) = t in x
static member Item4(t) = let (_,_,_,x,_,_) = t in x
static member Item4(t) = let (_,_,_,x,_,_,_) = t in x
static member Item5(t) = let (_,_,_,_,x) = t in x
static member Item5(t) = let (_,_,_,_,x,_) = t in x
static member Item5(t) = let (_,_,_,_,x,_,_) = t in x
static member Item6(t) = let (_,_,_,_,_,x) = t in x
static member Item6(t) = let (_,_,_,_,_,x,_) = t in x
static member Item7(t) = let (_,_,_,_,_,_,x) = t in x
Run Code Online (Sandbox Code Playgroud)
如何使用它:
let t = (1, 2, 3)
let item1 = Tuple.Item1(t)
Run Code Online (Sandbox Code Playgroud)
这里定义的 Tuple.Item1 比 fst 有优势:它对于项目数量是多态的。一旦我们使用这些扩展方法编写了使用 n 元组的函数,我们就可以将其扩展为 n+1 元组,而无需修改函数体。相反,我们必须修改参数类型声明。更省力。