2017-06-11 5 views
4

私はピアノのシートをレンダリングするアプリケーションを持っているので、いくつかの楽譜の概念をレコード構造に抽象化する必要があります。いくつかの型を節約するために、私はときどきメンバFromTupleをいくつかのレコード型に追加します。
オペレータ!>も導入されました。これはタプルを受け取り、適切なタプルを返します。 は、しかし私は、次の問題があります:F# "あいまいさ"のために一般的な制約が働かない

FS0332:演算子の使用に固有の曖昧さを解決できませんでした「FromTuple」は、このプログラム点またはその付近。あいまいさを解決するためにタイプ注釈を使用することを検討してください。

実際のエラーの原因を見つけることができません(最初に、いくつかのレコードフィールド名が複数のレコードタイプで定義されているかもしれませんが、そうではないようです)。


型定義:

type xyz = 
    { 
     // some record fields 
     Field1 : int 
     Field2 : bool 
     Field3 : string * string 
    } 
    with 
     static member FromTuple (a, b, c) = { Field1 = a; Field2 = b; Field3 = c } 

// more types defined like `xyz` 

[<AutoOpen>] 
module Globals = 
    let inline (!>) x = (^b : (static member FromTuple : ^a -> ^b) x) 

(別のファイルに)不良ライン:

//ERROR 
let my_xyz : xyz = !> (315, false, ("foo", "bar")) 

答えて

5

あなたxyz.FromTuple方法は、3つの別々のパラメータかかり:a: intb: bool、及びc: string * stringと、代わりに、単一のint * bool * (string * string)を取る必要があります。これを行うには、別の括弧でパラメータをラップします。

static member FromTuple ((a, b, c)) = { Field1 = a; Field2 = b; Field3 = c } 
関連する問題