F # и как использовать дженерики - PullRequest
1 голос
/ 11 июня 2019

Привет, у меня есть функция, которая должна возвращать параметр универсального значения, и он выглядит следующим образом:

let HandleHeaderConfirmation (client : TcpClient) (message : BaseFrame) (responseId : uint32, frameId: uint32) (isAcknowledgment : bool): Async<(Option<'TCommand> * TcpClient)> = 

    async{
        match isAcknowledgment with
            | false ->      
                let reason : NackRejectionReason = NackRejectionReason.InvalidCrc
                let nack : NackCommand = Confirmations.BuildNackResponse reason message (responseId, frameId)

                _logger.Info(sprintf "Sending header(CRC8) NACK reason %s" ((NackRejectionReason.InvalidCrc).ToString()))                                        
                _logger.Info(sprintf "Invalid header CRC8: %o raw header data %A" message.HeaderCrc message.RawHeaderData) 

                return (Some nack, client)
            | _ -> 
                _logger.Info(sprintf "Correct header(CRC8) message accepted")

                let ack : AckCommand = new AckCommand(responseId)
                return (Some ack, client)

    }

А для более подробной информации Команды Nack и Ack наследуются от BaseResponseCommand и наследуются от базового фрейма.

Моя проблема в том, что F # определяет TCommand только как NackCommand, и если я изменю это значение на

Async<(Option<BaseFrame> * TcpClient)>

, он ожидает, что базовый кадр не является командой Nack или Ack.Так возможна ли такая вещь?

1 Ответ

2 голосов
/ 11 июня 2019

Вам необходимо увеличить значения до BaseFrame при передаче их в Some, где вам нужно иметь option<BaseFrame>:

return (Some (nack :> BaseFrame), client)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...