Непонятное сообщение об ошибке «Ожидаемый тип блока, но был X» - PullRequest
0 голосов
/ 08 сентября 2011

Я либо не вижу ничего очевидного, либо просто сбит с толку Код у меня выглядит так:

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 (не то, чтобы он приносил мне пользу, если бы он был скомпилирован)

1 Ответ

1 голос
/ 08 сентября 2011

Для меня это нормально, учитывая следующие типы

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

Я подозреваю, что происходит что-то еще.Можете ли вы показать больше кода?

Странно, что createContext подразумевается как Account -> Account -> Context.Я бы ожидал 'T -> 'T -> Context ('T requires member DecreaseBalance and IncreaseBalance and LogMessage).Это может или не может быть ключом к вашей проблеме.

Если возможно, замените ограничения статических элементов интерфейсом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...