无法使绑定运算符与已区分的联合一起使用

时间:2019-08-29 06:39:03

标签: f# operators

我正在尝试在代码中使用“绑定运算符”(>> =)。

如果我使用运算符,则会出现编译错误,如果改为“内联”运算符应该执行的操作,则它会起作用。

type TestDI =
    private
    | A of string list
    | B of int list
with
    static member (>>=) (x: string list, f: TestDI -> 'a) =
        f <| A x

let func (t: TestDI) =
    match t with
    | A _ -> "a"
    | B _ -> "b"


// Expecting a type supporting the operator '>>=' but given a function type.
// You may be missing an argument to a function.
["a"] >>= func


// works
func <| A ["a"]

很明显我缺少了什么,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

使用运算符时,F#按顺序查找它:

  • 作为let定义的运算符;
  • 作为static member定义的两个参数类型之一的运算符。在这里,您要传递给运算符的参数是string listTestDI -> string,因此不会查看您在TestDI上定义的参数。

因此,这里的解决方案是改为let定义它:

type TestDI =
    private
    | A of string list
    | B of int list

let (>>=) (x: string list) (f: TestDI -> 'a) =
    f <| A x