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?