Es gibt zwei Lösungen, die beide verwenden explizite rekursive Schleife Definition, Hauptkonzept von Akka F # Schauspieler sehen.
Zuerst Sie Variablen definieren, die nur innerhalb Schauspieler Umfang, bevor Schleife Definition (in Beispiel I unten geändert haben i
Definition Referenzzelle, weil veränderbare Variablen nicht durch Schließungen erfasst werden können) sichtbar sein soll:
let actorRef =
spawn system "my-actor" <| fun mailbox ->
let i = ref 1
let rec loop() =
actor {
let! msg = mailbox.Receive()
match msg with
| Some x -> i := !i + x
| None ->()
return! loop()
}
loop()
jedoch mehr empfohlene Lösung ist Ihren Zustand unveränderlich während der Nachrichtenbehandlung zu halten, und es nur dann ändern, wenn in der nächsten Schleife Anrufen, so wie dies vorbei:
let actorRef =
spawn system "my-actor" <| fun mailbox ->
let rec loop i =
actor {
let! msg = mailbox.Receive()
match msg with
| Some x -> return! loop (i + x)
| None -> return! loop i
}
loop 1 // invoke first call with initial state
Nicht das, was du bist suchen, aber für [F # -Agenten ist der idiomatische Ansatz, eine rekursive Schleife zu verwenden, um den Zustand zu tragen] (https://msdn.microsoft.com/en-us/library/ee370357.aspx). Wenn Sie jedoch mit Akka.NET den Mutations-orientierten Pfad herunterfahren, kann es sich als unmöglich erweisen, es "schön" zu machen. Können Sie einen Akteur für Akka.NET auf andere Weise implementieren als von ReceiveActor? Etwas, mit dem Sie eine rekursive Poll-Schleife verwenden könnten? –
BTW, wenn es eine andere idiomatische Lösung gibt, ich bin nur ignorant darüber und würde gerne auch erzogen werden :) –