Как перевести метод ReceiveReady в NetMQ с C# на F#

Я работаю с библиотекой, в которой нет документации F#, только C#. Не зная C#, у меня возникли некоторые проблемы. Читая документацию для NetMQ, я обнаружил одну строку, которую не могу перевести. :

Для контекста, вот полный пример:

using (var rep1 = new ResponseSocket("@tcp://*:5001"))
using (var rep2 = new ResponseSocket("@tcp://*:5002"))
using (var poller = new NetMQPoller { rep1, rep2 })
{
    rep1.ReceiveReady += (s, a) =>    // ??????
    {
        string msg = a.Socket.ReceiveString();
        a.Socket.Send("Response");
    };
    rep2.ReceiveReady += (s, a) =>    // ??????
    {
        string msg = a.Socket.ReceiveString();
        a.Socket.Send("Response");
    };

    poller.Run();
}

В частности, я не знаю, что означает rep1.ReceiveReady += (s, a) => в контексте C#, а также как перевести его на F#. Любые идеи? Спасибо.


person professor bigglesworth    schedule 30.07.2016    source источник
comment
См. мой ответ здесь: stackoverflow.com/a/34161972/3932049 для получения информации об операторе =›   -  person Camilo Terevinto    schedule 31.07.2016
comment
@CamiloTerevinto: это не имеет ничего общего с членами с выраженным телом, это просто лямбда...   -  person ildjarn    schedule 31.07.2016
comment
Я автор NetMQ, рад, что вы используете NetMQ и нашли ответ. Вы можете внести свой вклад в проект, добавив документы F# или какой-нибудь пример.   -  person somdoron    schedule 31.07.2016
comment
Это отличная библиотека. На самом деле в некоторых случаях документы NetMQ обеспечивают лучшее объяснение некоторых концепций, чем Zguide. Я вполне мог бы предоставить несколько примеров F# в будущем. Спасибо за отличную работу.   -  person professor bigglesworth    schedule 31.07.2016


Ответы (1)


rep.ReceiveReady += (s, a) => { /*...*/ }; подписывается на событие ReceiveReady с помощью лямбда-функции. Вот прямой перевод F#:

use rep1 = new ResponseSocket("@tcp://*:5001")
use rep2 = new ResponseSocket("@tcp://*:5002")

use poller = new NetMQPoller()
poller.Add rep1
poller.Add rep2

rep1.ReceiveReady.Add (fun a -> let msg = a.Socket.ReceiveString ()
                                a.Socket.Send "Response")
rep2.ReceiveReady.Add (fun a -> let msg = a.Socket.ReceiveString ()
                                a.Socket.Send "Response")

poller.Run ()

Дополнительную информацию об обработке событий в F# можно найти в документация. Обратите внимание, однако, что F# также может обрабатывать события как наблюдаемые, что, вероятно, будет считаться более идиоматичным.

person ildjarn    schedule 31.07.2016