2010-11-08 24 views
0

我該如何在這種類型中調用send(a:'T [])?F#獨特的過載方法

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,我不能夠發送一個數組進去。

謝謝
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 
+0

工作,謝謝! – 2010-11-08 08:58:52

2

那麼,F#不能確定,如果你的T是一個int或int數組,所以唯一的辦法,我可以看到工作圓你的問題是這樣的

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

或本

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

最後,我可以回答一個F#的問題。已經很久了! – Benjol 2010-11-08 08:18:07

+0

嗨,感謝您的建議。但它並不像預期的那樣工作。當我運行let b = test.send [| 4 |]我得到4作爲結果,我應該得到5 – 2010-11-08 08:23:35

+0

這也是我的第一反應,但如果** T是一個int數組**,那麼傳遞'[| 4 |]'會調用第一個重載。 – Benjol 2010-11-08 08:56:56

0

您可以通過使用PATT做到這一點上類型ERN匹配:

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

這將匹配於在F#(陣列,列表,序列)任何Seq類型。一旦你有正確的匹配,通常更容易爲特定類型實現私有函數。