"예상 유형 단위하지만 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<_>
뭔가 다른 일이 벌어지고 의심 주어, 나를 위해 잘 컴파일
인터페이스로 교체하는 것은 옵션이 아닙니다. 이것은 명백한 인터페이스를 피하기위한 연습입니다. (그것은 구글 그룹에서 논쟁 한 결과이다 : 객체 - 구성) –
코드가 다소 혼란 스럽다. 'f'는 두 번 정의됩니다 - 두 정의는 사용되지 않습니다. 어쩌면'Context'와'Account'의 정의를 보면 분명히 알 수 있습니다. – Daniel
그래서 문제가 무엇입니까? – Daniel