我要么看不到明显的东西,要么只是普遍混淆 我看到的代码如下:
let inline createContext source destination =
let src = (fun amount (s:^T) -> (^T : (member DecreaseBalance : decimal -> ^a) (s, amount)))
let dst = (fun amount (d:^T) -> (^T : (member IncreaseBalance : decimal -> ^a) (d, amount)))
let log = (fun msg a -> (^T : (member LogMessage : string -> ^a) (a, msg)))
let f = fun amount -> src amount source |> ignore
log "" source |> ignore
let f = fun amount -> dst amount destination |> ignore
log "" destination |> ignore
new Context (source, destination, src, dst, log)
let src = new Account(0m)
let dst = new Account(0m)
let ctxt = createContext src dst
类型帐户满足createContext的成员约束。 Intellisense声称createContext的标志是Account - >帐户 - >上下文但是编译器在最后一行的src中抱怨“这个表达式应该有类型单元但是这里有类型Account” 知道我错过了什么吗?
如果我重命名Account的成员函数,那么它就不再符合我得到的约束 “类型'帐户'不支持任何名为'LogMessage'的运算符”,这是我在这种情况下所期望的。如果我将()作为第一个参数传递,我会收到相同的错误消息。那个单元不支持LogMessage(并不是说如果实际编译它会给我带来任何好处)
答案 0 :(得分:1)
考虑到以下类型
,这对我来说很好type Context(a, b, c, d, e) = class end
type Account(a) =
member __.DecreaseBalance(a) = Unchecked.defaultof<_>
member __.IncreaseBalance(a) = Unchecked.defaultof<_>
member __.LogMessage(a) = Unchecked.defaultof<_>
我怀疑其他事情正在发生。你能展示更多的代码吗?
奇怪的是createContext
被推断为Account -> Account -> Context
。我希望'T -> 'T -> Context ('T requires member DecreaseBalance and IncreaseBalance and LogMessage
)。这可能是也可能不是您问题的线索。
如果可能,请使用接口替换静态成员约束。