令人困惑的错误消息“预期的类型单位但是是X”

时间:2011-09-08 14:50:10

标签: f#

我要么看不到明显的东西,要么只是普遍混淆 我看到的代码如下:

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(并不是说如果实际编译它会给我带来任何好处)

1 个答案:

答案 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)。这可能是也可能不是您问题的线索。

如果可能,请使用接口替换静态成员约束。