F# 为什么这个静态类型的成员访问认为它是一个getter?
F# 为什么这个静态类型的成员访问认为它是一个getter?,f#,duck-typing,structural-typing,F#,Duck Typing,Structural Typing,rvm是一个对象,而不是一个函数 为什么约束(^b:(member ReportSubTitle:(String->unit))rvm)作为getter而不是setter出现?这是工具提示问题还是其他问题 在我使用静态类型泛型的其他地方,我发现我甚至不必告诉它类型。这也不起作用: // Setup the sub title with the total let subTitleSetter = (^b:(member ReportSubTitle:_) rvm ) subTitleSette
rvm
是一个对象,而不是一个函数
为什么约束(^b:(member ReportSubTitle:(String->unit))rvm)
作为getter而不是setter出现?这是工具提示问题还是其他问题
在我使用静态类型泛型的其他地方,我发现我甚至不必告诉它类型。这也不起作用:
// Setup the sub title with the total
let subTitleSetter = (^b:(member ReportSubTitle:_) rvm )
subTitleSetter ("Total: " + total.ToString("C") )
将此尝试移动到函数中,并尝试@kvb建议的内容
这是
rvm
在封闭范围/方法中的唯一用途我不完全确定通过静态成员约束调用setter的正确方法是什么。我总是觉得功能的边缘有点粗糙,如果可能的话,我更喜欢使用其他选项(即定义接口并通过接口访问成员)
也就是说,看起来可以在约束中使用set\u PropertyName
。下面的小例子对我来说很好:
type A() =
member val Foo = 0 with get, set
let a = A()
let setter v = (^b:(member set_Foo : int -> unit) (a, v) )
setter 42
a.Foo
尝试不使用成员类型的括号:
ReportSubTitle:String->unit
。这将方法与函数值属性区分开来。尝试过它,“期望2个表达式,得到1”您必须同时提供rvm
和test
作为参数(作为语法元组)。