gpt4 book ai didi

F# : How to provide fst for tuples, 三倍和四倍而不牺牲运行时性能

转载 作者:行者123 更新时间:2023-12-04 21:56:49 28 4
gpt4 key购买 nike

对于具有 2 个元素的基本元组,我们有 fst 和 snd:

let t2 = (2, 3)
fst t2 // = 2
snd t2 // = 3

简单。现在有 3 个元素
let t3 = (2, 3, 4)

我们如何访问第三个元素? msdn 有一个答案( http://msdn.microsoft.com/en-us/library/dd233200.aspx ):
let third (_, _, c) = c

还是很轻松的。但实际上具有欺骗性,因为我们不能在这样的三元组上使用 fst 和 snd:
fst t3

error FS0001: Type mismatch. Expecting a int * int but given a int * int * int
The tuples have differing lengths of 2 and 3

因此,具有挑战性的问题: 我们如何在不牺牲运行时性能的情况下为元组、三元组和四元组提供函数 fst?

不起作用的方法:

A) 简单地添加 fst(,,_)
let fst (a,_,_) = a // hides fst (a,b), so tuples dont work anymore

B) 任何反射技巧,因为性能受到影响或棘手的函数组合导致在 jitted 代码级别的额外调用。

C)扩展方法(没有带我去任何地方,也许其他人有更好的想法)
type Tuple<'T1, 'T2, 'T3> with
member o.fst(a,b,c) = a
static member fst(a,b,c) = a

除了具有其他签名 (t3.fst()) 之外,我什至无法获得使用元组的扩展,尽管它们是类(不是结构)。

D)
let fst = function 
| (a,b) -> a
| (a,b,c) -> a // FS0001: Type mismatch

这个问题的意思是因为它被制定出来,而不是为了解决方法。实际上我相信答案是不可能提供在元组上运行的通用函数。

最佳答案

使用 this technique方法重载与内联函数在运行时完全没有惩罚,因为重载解析发生在编译时,重载的函数在调用点内联。

有更复杂的方法可以在库中组织这些类型的通用元组函数,@MauricioScheffer 已经发布了一些链接,显示了更多使用基本相同技术的实验。

这是一个非常短的独立代码片段来重载函数 fst使其适用于其他元组大小:

type Fst = Fst with
static member ($) (Fst, (x1,_)) = x1
static member ($) (Fst, (x1,_,_)) = x1
static member ($) (Fst, (x1,_,_,_)) = x1
// more overloads

let inline fst x = Fst $ x

关于F# : How to provide fst for tuples, 三倍和四倍而不牺牲运行时性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27924235/

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