由于"歧义",F#通用约束不起作用

unk*_*656 4 generics f# constraints operator-overloading

我有一个应用程序,它呈现钢琴表,因此我必须将一些乐谱概念抽象为记录结构.为了节省一些输入,我有时会将成员添加FromTuple到某些记录类型中.
我还介绍了运算符!>,它接受一个元组并返回适当的元组.但是,我有以下问题:

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)
Run Code Online (Sandbox Code Playgroud)

故障线(在单独的文件中):

//ERROR
let my_xyz : xyz = !> (315, false, ("foo", "bar"))
Run Code Online (Sandbox Code Playgroud)

ild*_*arn 5

你的xyz.FromTuple方法有三个独立的参数:a: int,b: bool,和c: string * string; 相反,你需要它采取单一int * bool * (string * string).通过将参数包装在另一组括号中来执行此操作:

static member FromTuple ((a, b, c)) = { Field1 = a; Field2 = b; Field3 = c }
Run Code Online (Sandbox Code Playgroud)