以下代码
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
答案 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)