2016-12-29 7 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_sizex引数に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が存在する必要があります。

それ以外の場合は、タプルでのみクラスを調べることはなく、タプル型にはそのようなメソッドはありません。

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)) 

この代替フォームが機能します。いくつかの余分なボクシングがありますが、プラス側では、私はどこにラムダを渡す必要はありません。奇妙なことに、size_to_total_sizelet inline size_to_total_size x = ((^s) : (static member TotalSize: TotalSizeToken< ^s> -> int) x)のように書かれているとうまくいかない。

関連する問題