静态解析类型参数需要额外的表达式

rob*_*kuz 2 f#

以下代码

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个表达式?任何人都可以解释提出一个有效的解决方案吗?

谢谢

Pie*_*ann 6

我不确定你想要实现什么,但是这有效:

  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)