Jak wykonać połączone wywołania zwrotne w F #?

W języku C # używam asynchronicznych wersji TcpListener / TcpClient i łączę je za pomocą metody wywołania zwrotnego, tak że kolejna funkcja Akceptuj / Odczyt jest publikowana po zakończeniu wywołania zwrotnego. Oto przykład (niesprawdzony):

    public void Start()
    {
        TcpListener listener = new TcpListener(IPAddress.Any, 3000);
        listener.Start();

        PostAccept(listener);
    }

    private void PostAccept(TcpListener listener)
    {
        listener.BeginAcceptTcpClient(AcceptCallback, listener);
    }

    private void AcceptCallback(IAsyncResult ar)
    {
        var listener = ar.AsyncState as TcpListener;

        if (listener == null)
        {
            return;
        }

        // get the TcpClient and begin a read chain in a similar manner

        PostAccept(listener);
    }

Moje pytanie brzmi: jak modelować coś podobnego w F #? Czy użyłbym słowa kluczowego async? Czy kod po BeginAcceptTcpClient, BeginRead itp. Zasadniczo jest kodem, który zostałby wykonany w funkcji wywołania zwrotnego? Na przykład, czy to jest poprawne?

let accept(listener:TcpListener) = async {      
  let! client = listener.AsyncAcceptTcpClient()    
  // do something with the TcpClient such as beginning a Read chain
  accept(listener)
  return()
}    

Powyższy kod nie działa, ponieważ accept nie jest zdefiniowane, a oznaczenie go rekurencyjnie technicznie nie jest prawdą, ponieważ nie jest to metoda rekurencyjna?

questionAnswers(2)

yourAnswerToTheQuestion