我正在尝试在代码中使用“绑定运算符”(>> =)。
如果我使用运算符,则会出现编译错误,如果改为“内联”运算符应该执行的操作,则它会起作用。
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"]
很明显我缺少了什么,有人可以帮忙吗?
答案 0 :(得分:4)
使用运算符时,F#按顺序查找它:
let
定义的运算符; static member
定义的两个参数类型之一的运算符。在这里,您要传递给运算符的参数是string list
和TestDI -> string
,因此不会查看您在TestDI
上定义的参数。因此,这里的解决方案是改为let
定义它:
type TestDI =
private
| A of string list
| B of int list
let (>>=) (x: string list) (f: TestDI -> 'a) =
f <| A x