Je suis soit de ne pas voir quelque chose d'évident ou juste généralement confus Le code je ressemble à:message d'erreur Déroutant « unité de type attendu, mais était 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
Le type compte fullfils les contraintes membres de CreateContext . Intellisense réclame le signartur de createContext à Account -> Account -> Context mais le compilateur se plaint à src dans la dernière ligne avec "Cette expression devait avoir l'unité de type mais ici a le type Account" N'importe quelle idée de ce qui me manque ?
Si je renommer une fonction membre de Compte pour qu'elle ne réponde plus aux contraintes "Le type 'Compte' ne supporte pas les opérateurs nommés 'LogMessage'" ce qui est ce que j'attendrais dans ce scénario. Je reçois le même message d'erreur si je passe() comme premier argument. Cette unité ne supporte pas LogMessage (pas que cela me apporterait tout bon si cela en fait compilé)
Le remplacement par une interface n'est pas une option. C'est un exercice pour éviter les interfaces explicites. (c'est le résultat d'un débat sur un groupe google: objet-composition) –
Le code est un peu déroutant. 'f' est défini deux fois - les deux définitions sont inutilisées. Peut-être que voir les définitions de 'Context' et' Account' éclaircirait les choses. – Daniel
Alors, quel était le problème? – Daniel