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

时间:2016-06-16 08:45:08

标签: 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 )

产生此错误

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

我真的不明白为什么它期待2个表情? 任何人都可以解释提出一个有效的解决方案吗?

THX

1 个答案:

答案 0 :(得分: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)

据我了解,第一个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)