以下代码
let inline foo< ^T, ^U when ^T : (member foo : (^U -> ^T) -> ^T -> ^T)>
(f:(^U -> ^T)) (t:^T) : ^T =
(^T : (member foo : (^U -> ^T) -> ^T -> ^T) f,t )
Run Code Online (Sandbox Code Playgroud)
产生此错误
let inline foo< ^T, ^U when ^T : (member foo : (^U -> ^T) -> ^T -> ^T)> (f:^U) (t:^T) : ^T = (^T : (member foo : (^U -> ^T) -> ^T -> ^T) f,t );;
-----------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/stdin(45,96): error FS0735: Expected 3 expressions, got 2
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么它期待2个表达式?任何人都可以解释并提出一个有效的解决方案吗?
谢谢
我不确定你想要实现什么,但是这有效:
let inline foo< ^T, ^U when ^T : (member foo : (^U -> ^T) -> ^T -> ^T)>
(f:(^U -> ^T)) (t:^T) : ^T =
(^T : (member foo : (^U -> ^T) -> ^T -> ^T) t, f, t)
Run Code Online (Sandbox Code Playgroud)
据我了解,第一个t必须从^T类型的实例中提取foo方法.
或者您可能希望该^T类型的foo方法是静态的.在这种情况下,以下代码有效:
let inline foo2< ^T, ^U when ^T : (static member foo : (^U -> ^T) -> ^T -> ^T)>
(f:(^U -> ^T)) (t:^T) : ^T =
(^T : (static member foo : (^U -> ^T) -> ^T -> ^T) f, t)
Run Code Online (Sandbox Code Playgroud)