如何进行元组扩充

Lea*_*erX 2 f#

以下代码来自《F# 4.0 设计模式》第 5 章。

let a = 1,"car" 
type System.Tuple<'T1,'T2> with 
  member t.AsString() = 
    sprintf "[[%A]:[%A]]" t.Item1 t.Item2 
(a |> box :?> System.Tuple<int,string>).AsString()
Run Code Online (Sandbox Code Playgroud)

期望的输出是[[1]:["car"]]

但是,下面会出现一条红色波浪线AsString()。“字段、构造函数或成员‘AsString’未定义。也许您需要以下之一:ToString”

Tom*_*cek 5

这是一个有点奇怪的代码示例 - 我怀疑它的要点是 F# 元组实际上是使用System.Tuple- 通过显示可以在普通 F# 元组上调用的扩展来表示的 .NET 元组System.Tuple

我怀疑 F# 的行为已经改变,它不再允许这样做 - 可能是在 上允许添加扩展System.Tuple,但在普通 F# 元组上不允许,但两者在编译器中变得更加统一。

但是,您可以使用 .NET 样式的扩展方法执行非常类似的操作:

let a = 1,"car" 

[<System.Runtime.CompilerServices.ExtensionAttribute>]
type TupleExtensions =
  [<System.Runtime.CompilerServices.ExtensionAttribute>]
  static member AsString(t:System.Tuple<'T1,'T2>) = 
    sprintf "[[%A]:[%A]]" t.Item1 t.Item2 

let st = (a |> box :?> System.Tuple<int,string>)
st.AsString()
Run Code Online (Sandbox Code Playgroud)

实际上也可以直接在 F# 元组值上调用:

("car", 32).AsString()
Run Code Online (Sandbox Code Playgroud)