【问题标题】:Confusing error message "Expected type unit but was X"令人困惑的错误消息“预期类型单元但为 X”
【发布时间】:2011-09-08 22:56:54
【问题描述】:

我要么没有看到明显的东西,要么只是普遍感到困惑 我的代码如下:

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

Account 类型满足 createContext 的成员约束。 Intellisense 声称 createContext 的签名是 Account -> Account -> Context 但编译器在最后一行的 src 抱怨“这个表达式应该有类型单元,但这里有类型 Account” 知道我缺少什么吗?

如果我重命名 Account 的成员函数,使其不再符合我得到的约束 “'Account' 类型不支持任何名为 'LogMessage' 的运算符”,这是我在那种情况下所期望的。如果我将 () 作为第一个参数传递,我会收到相同的错误消息。该单元不支持 LogMessage(并不是说如果实际编译它会给我带来任何好处)

【问题讨论】:

    标签: f#


    【解决方案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 -&gt; Account -&gt; Context。我希望'T -&gt; 'T -&gt; Context ('T requires member DecreaseBalance and IncreaseBalance and LogMessage)。这可能是也可能不是您的问题的线索。

    如果可能,将静态成员约束替换为接口。

    【讨论】:

    • 不能用接口替换。这是避免显式接口的练习。 (这是一个 google group 辩论的结果:object-composition)
    • 代码有点混乱。 f 定义了两次——两个定义都未使用。或许看到ContextAccount 的定义就能搞清楚。
    • f 是故意不用的。 f 的定义是测试源和目标是否满足稍后将使用的约束。是的,这有点奇怪,但它更多的是证明强类型语言的属性而不是其他任何东西。你确实让我走上了正轨。我在上下文中有错误的缩进
    • 更详细地说,src 用于由于缩进错误而返回单位的表达式。错误消息是错误的并且在错误的行上。警告我正在抛出一种返回值的方式,这将是我所期望的
    猜你喜欢
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2018-02-25
    • 2014-10-11
    • 2015-07-30
    • 2016-02-09
    相关资源
    最近更新 更多