我不是沒有看到明顯的東西或者只是一般迷茫 我看起來像代碼:令人困惑的錯誤消息「預期類型單位,但被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(不在於它會給我帶來任何好處,如果實際上編譯)
用接口替換不是一種選擇。這是避免顯式接口的練習。 (這是Google組織辯論的結果:對象組合) –
代碼有點混亂。 'f'被定義兩次 - 兩個定義都未被使用。也許看到'Context'和'Account'的定義可以解決問題。 – Daniel
那麼問題是什麼? – Daniel