【问题标题】:F# unique overload methodF#独特的重载方法
【发布时间】:2011-05-06 13:05:23
【问题描述】:

我怎样才能以这种类型调用 send(a:'T [])?

type Test() =
  member o.send(value:'T) = 4
  member o.send(values:'T []) = 5

let test = Test()
let b = test.send [|4|]

当我这样做时,我得到了

A unique overload for method 'Send' could not be determined based on type information 
prior to this program point. The available overloads are shown below...

关键是 MPI.NET 正好有这个称为 Send 的方法,但我无法向其中发送数组。

谢谢你,
奥尔德里奇

【问题讨论】:

    标签: generics f# types


    【解决方案1】:

    好吧,F# 无法确定您的 T 是一个 int 还是一个 int 数组,所以我认为解决您的问题的唯一方法是这样

    let b = test.send<int> [|4|]
    

    或者这个

    let b = test.send<int array> [|4|]
    

    【讨论】:

    • 最后,我可以回答一个 F# 问题。好久不见!
    • 您好,感谢您的建议。但是,它没有按预期工作。当我运行 let b = test.send [|4|] 我得到 4 作为结果,我应该得到 5。
    • 这也是我的第一反应,但如果 T 是 int array,那么传递 [|4|] 将调用第一个重载。
    • @Oldrich,对不起,我倒读了你的问题 - 我的回答显示了调用这两个重载的替代方法。
    【解决方案2】:
    type Test() =
      member o.send(a:'T) = 4
      member o.send(a:'T []) = 5
    
    let test = Test()
    let b = test.send<int>([|4|] : _[]) // 5
    

    【讨论】:

      【解决方案3】:

      您可以通过对类型使用模式匹配来做到这一点:

      type MyTest() =
          member this.Send (a : obj)  = 
              match a with
              | :? System.Collections.IEnumerable -> 5
              | _ -> 4
      

      这将匹配 F# 中的任何 Seq 类型(数组、列表、序列)。一旦你有正确的匹配,通常更容易为特定类型实现私有函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 2013-02-08
        • 1970-01-01
        • 1970-01-01
        • 2020-07-28
        • 2021-04-16
        相关资源
        最近更新 更多