2011-09-08 49 views
0

我不是沒有看到明顯的東西或者只是一般迷茫 我看起來像代碼:令人困惑的錯誤消息「預期類型單位,但被X」

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 

帳戶的類型fullfils的的createContext成員限制。 Intellisense聲稱createContext的簽名是Account - > Account - > Context,但是編譯器在最後一行的src中抱怨,「這個表達式預期會有type type unit,但是這裏有類型Account」 任何關於我失蹤的信息?

如果我重命名帳戶的成員函數,使其不再符合約束條件,我得到 「類型'帳戶'不支持任何名爲'LogMessage'的運算符,這正是我所期望的。如果我將pass()作爲第一個參數,我會得到相同的錯誤消息。該單位不支持的LogMessage(不在於它會給我帶來任何好處,如果實際上編譯)

回答

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)。這可能或可能不是你的問題的線索。

如果可能,請用接口替換靜態成員約束。

+0

用接口替換不是一種選擇。這是避免顯式接口的練習。 (這是Google組織辯論的結果:對象組合) –

+0

代碼有點混亂。 'f'被定義兩次 - 兩個定義都未被使用。也許看到'Context'和'Account'的定義可以解決問題。 – Daniel

+1

那麼問題是什麼? – Daniel