2011-09-08 2 views
0

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é)

Répondre

1

Cette compile très bien pour moi, compte tenu des types suivants

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<_> 

Je soupçonne que quelque chose d'autre se passe. Pouvez-vous montrer plus de code?

Il est étrange que createContext soit déduit Account -> Account -> Context. Je m'attendrais à 'T -> 'T -> Context ('T requires member DecreaseBalance and IncreaseBalance and LogMessage). Cela peut ou peut ne pas être un indice de votre problème.

Si possible, remplacez les contraintes de membre statiques par une interface.

+0

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) –

+0

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

+1

Alors, quel était le problème? – Daniel

Questions connexes