2011-09-08 5 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의 signartur가 Account -> Account -> Context로 주장하지만 컴파일러는 "이 표현식에는 유형 단위가 있어야하지만 여기에는 유형 계정이 있습니다"라는 마지막 줄의 src에서 불평합니다 내가 누락 된 것의 아이디어 ?

계정의 멤버 함수 이름을 더 이상 제약 조건을 충족하지 않게하면 이됩니다. "Account '유형은'LogMessage '라는 연산자를 지원하지 않습니다. 이는이 시나리오에서 기대하는 것입니다. 첫 번째 인수로 pass()하면 동일한 오류 메시지가 나타납니다. 그 장치는이 다음과 같은 유형의

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

뭔가 다른 일이 벌어지고 의심 주어, 나를 위해 잘 컴파일

답변

1

(실제로 컴파일 된 경우 나에게 어떤 좋은 흐흐흐되지 않음) LogMessage를 지원하지 않습니다. 더 많은 코드를 보여줄 수 있습니까?

createContextAccount -> Account -> Context으로 추정됩니다. 나는 'T -> 'T -> Context ('T requires member DecreaseBalance and IncreaseBalance and LogMessage를 기대할 것이다). 그것은 당신의 문제에 대한 단서 일 수도 있고 아닐 수도 있습니다.

가능하면 정적 멤버 제약 조건을 인터페이스로 바꿉니다.

+0

인터페이스로 교체하는 것은 옵션이 아닙니다. 이것은 명백한 인터페이스를 피하기위한 연습입니다. (그것은 구글 그룹에서 논쟁 한 결과이다 : 객체 - 구성) –

+0

코드가 다소 혼란 스럽다. 'f'는 두 번 정의됩니다 - 두 정의는 사용되지 않습니다. 어쩌면'Context'와'Account'의 정의를 보면 분명히 알 수 있습니다. – Daniel

+1

그래서 문제가 무엇입니까? – Daniel