Взаимно рекурсивные функции F #, типизирующие проблемы - PullRequest
0 голосов
/ 28 февраля 2012

Возникли проблемы с этим кодом:

  let subscribe (nm : NamespaceManager) (subName : string) (desc : TopicDescription)  : Async<SubscriptionDescription> =
    let rec first_create () =
      async {
        let! exists = desc |> exists nm
        if exists then return! (then_create_subscription () : Async<SubscriptionDescription>)
        try
          let beginCreate = nm.BeginCreateTopic : string * AsyncCallback * obj -> IAsyncResult
          logger.DebugFormat("creating topic '{0}'", desc)
          let! tdesc = Async.FromBeginEnd(desc.Path, beginCreate, nm.EndCreateTopic)
          return! first_create ()
        with | :? MessagingEntityAlreadyExistsException -> return! then_create_subscription () }
    and then_create_subscription ()  : Async<SubscriptionDescription> =
      async {
        let beginCreate = nm.BeginCreateSubscription : string * string * AsyncCallback * obj -> IAsyncResult
        return! Async.FromBeginEnd(desc.Path, subName, beginCreate, nm.EndCreateSubscription) }
    first_create ()

В строке 5 он подчеркивает then_create_subscription () : Async<SubscriptionDescription>, заявив:

Несоответствие типов. Ожидается Async<unit>, но с учетом Async<SubscriptionDescription> Тип 'unit' не соответствует типу 'SubscriptionDescription'

Exists выглядит следующим образом:

  let exists (nm : NamespaceManager ) (desc : PathBasedEntity) = 
    async { return! Async.FromBeginEnd(desc.Path, nm.BeginTopicExists, nm.EndTopicExists) }

Я хочу, чтобы он создал тему и затем создал для нее подписку.

Есть идеи?

1 Ответ

1 голос
/ 11 декабря 2012

После if должна быть ветвь else, в противном случае if является оператором, а не выражением. Остальное не является неявным.

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