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

时间:2017-06-11 10:43:00

标签: generics f# operator-overloading constraints

我有一个应用程序,它呈现钢琴表,因此我必须将一些乐谱概念抽象为记录结构。为了节省一些输入,我有时会将成员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"))

1 个答案:

答案 0 :(得分:5)

您的import time number = 1000000001 count = 0 start = time.time() while number > 1000000000 and number < 10000000000000: for i in range(1, round(number/2 + 1)): if (number / i).is_integer(): count += 1 if count > 1: break if count < 2: print(str(number) + ' prime') number = number + 1 count = 0 end = time.time() print(end - start) 方法有三个不同的参数:xyz.FromTuplea: intb: bool;相反,你需要它来取一个c: string * string。通过将参数包装在另一组括号中来完成此操作:

int * bool * (string * string)