2016-12-29 59 views
3
type TotalSizeToken = TotalSizeToken with 
    static member TotalSize(_: TotalSizeToken, (a,b,c,d,e)): int = a*b*c*d*e 
    static member TotalSize(_: TotalSizeToken, (a,b,c,d)): int = a*b*c*d 
    static member TotalSize(_: TotalSizeToken, (a,b,c)): int = a*b*c 
    static member TotalSize(_: TotalSizeToken, (a,b)): int = a*b 
    static member TotalSize(_: TotalSizeToken, x: int): int = x 

let inline size_to_total_size x = 
    ((^s) : (static member TotalSize: TotalSizeToken * ^s -> int) TotalSizeToken, x) 

let t = size_to_total_size (1,5) // Error: Expecting a type supporting the operator TotalSize, but given a tuple type. 

我沒有想到size_to_total_size中的x參數需要TotalSize成員。這感覺就像一個編譯器錯誤。如何獲得具有可變數量參數的整數元組的產品?

我不知道如何讓這個工作。有任何想法嗎?

回答

8

你錯過了其他的「帽子」類型:

let inline size_to_total_size x = 
    let call (t:^T) = ((^s or ^T) : (static member TotalSize: TotalSizeToken * ^s -> int) t, x) 
    call TotalSizeToken 

必須有兩個人,正在傳遞的參數,並表示包含重載類中的一個。

否則,它不會查看類,只能在元組中找到,而元組類型中沒有這樣的方法。

1
type TotalSizeToken<'u> = TotalSizeToken of 'u with 
    static member TotalSize(x: TotalSizeToken<int*int*int*int*int>): int = 
     match x with TotalSizeToken (a,b,c,d,e) -> a*b*c*d*e 
    static member TotalSize(x: TotalSizeToken<int*int*int*int>): int = 
     match x with TotalSizeToken (a,b,c,d) -> a*b*c*d 
    static member TotalSize(x: TotalSizeToken<int*int*int>): int = 
     match x with TotalSizeToken (a,b,c) -> a*b*c 
    static member TotalSize(x: TotalSizeToken<int*int>): int = 
     match x with TotalSizeToken (a,b) -> a*b 
    static member TotalSize(x: TotalSizeToken<int>): int = 
     match x with TotalSizeToken x -> x 

let inline size_to_total_size x = 
    ((^s) : (static member TotalSize: ^s -> int) x) 

let t = size_to_total_size (TotalSizeToken(1,5)) 

這種替代形式的作品。有一些額外的拳擊,但從好的方面來說,我不需要到處傳遞lambda。奇怪的是,如果size_to_total_size被寫爲let inline size_to_total_size x = ((^s) : (static member TotalSize: TotalSizeToken< ^s> -> int) x),那麼它不起作用。

相關問題