gpt4 book ai didi

generics - 是否可以为 F# 元组创建扩展方法

转载 作者:行者123 更新时间:2023-12-01 12:46:50 28 4
gpt4 key购买 nike

我正在尝试为 F# 元组创建类型扩充方法。这段代码编译得很好:

type System.Tuple<'a, 'b> with
member this.ToParameter name =
match this with
| this -> sprintf "%s=%O,%O" name (this.Item1, this.Item2)

但是,当我尝试调用此方法时:

printfn "%s" (("cat", 2).ToParameter("test"))

我收到一条错误消息“未定义此字段、构造函数或成员‘ToParameter’”。在解释器中,以下表达式将它们的类型报告为某种形式的 System.Tuple'2:

typedefof<'a * 'b>.FullName
(1, 2).GetType().FullName

在 Visual Studio 中,如果我将鼠标悬停在表达式上:

let a = 1, 2

它报告了一个 int * int 类型。当我尝试扩充此类型或它的通用等效项 'a * 'b 时,我收到错误消息。

是否可以为 F# 元组创建通用扩充?

最佳答案

您问题的答案与我对类似问题的答案几乎相同 here .也就是说,您的类型扩展不起作用的原因是因为“System.Tuple<_,...,_> 只是元组的编码形式,而不是编译器使用的静态表示形式。请参阅规范中的 6.3.2 Tuple Expressions。”

要使用你的类型扩展,你必须先装箱然后转换你的元组值:

let tuple = box ("cat", 2) :?> System.Tuple<string,int>
printfn "%s" (tuple.ToParameter("test"))

另外:还要注意你的类型扩展中有一个轻微的语法错误,它应该是:

type System.Tuple<'a, 'b> with
member this.ToParameter name =
match this with
| this -> sprintf "%s=%O,%O" name this.Item1 this.Item2 //removed parens around Item1 and Item2

关于generics - 是否可以为 F# 元组创建扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15048962/

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