Я либо не вижу ничего очевидного, либо просто сбит с толку
Код у меня выглядит так:
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 утверждает, что signartur createContext имеет значение Account -> Account -> Context, но компилятор жалуется на src в последней строке: «Ожидается, что это выражение будет иметь тип unit, но здесь имеет тип Account»
Есть идеи о том, что мне не хватает?
Если я переименую функцию-член учетной записи, чтобы она больше не соответствовала полученным ограничениям
«Тип« Учетная запись »не поддерживает никаких операторов с именем« LogMessage »», что я и ожидал в этом сценарии. Я получаю то же сообщение об ошибке, если я передаю () в качестве первого аргумента. Этот модуль не поддерживает LogMessage (не то, чтобы он приносил мне пользу, если бы он был скомпилирован)