【问题标题】:F# Generic constraint not working due to "ambiguity"由于“歧义”,F# 通用约束不起作用
【发布时间】:2017-11-12 22:53:13
【问题描述】:

我有一个应用程序,它可以渲染钢琴谱,因此我必须将一些乐谱概念抽象到唱片结构中。为了节省一些输入,我有时会在某些记录类型中添加成员 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)

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

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

【问题讨论】:

    标签: generics f# operator-overloading constraints


    【解决方案1】:

    您的xyz.FromTuple 方法采用三个单独的参数:a: intb: boolc: string * string;相反,您需要使用单个int * bool * (string * string)。通过将参数包装在另一组括号中来做到这一点:

    static member FromTuple ((a, b, c)) = { Field1 = a; Field2 = b; Field3 = c }
    

    【讨论】:

      猜你喜欢
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多