Sto lavorando con questo codice:Scala classe caso con la funzione di parametri
case class State[S, +A](run: S => (A, S)) {
...
def flatMap[B](f: A => State[S, B]): State[S, B] = State(s => {
val (a, s1) = run(s)
f(a).run(s1)
})
...
}
Questa è un'astrazione per lavorare con lo stato puramente funzionale, dal § 6 di FP in Scala. run
è un parametro di funzione che accetta uno stato ed emette una tupla di un valore e il nuovo stato.
La mia domanda è di circa la sintassi s =>
in questa sezione:
... B] = State(s => { ...
Questo sembra essere utilizzando il 'costruttore' State
(cioè apply
) per costruire un nuovo oggetto Stato. Ma cosa rappresenta il s
? È uno stato "anonimo", che rappresenta un'istanza di stato? In tal caso, in che modo è diverso da this
? O si fa s corrisponde al parametro di ingresso del run
cioè il S
da:
... (run: S => ....
E perché dovrei fare uso di un costruttore per una definizione di funzione? Si noti che l'ultimo simbolo della definizione flatMap è un )
non uno }
, che sta chiudendo il costruttore State
apply.
Questo scenario è un po 'diverso rispetto allo standard scenario
case class Person(name: String)
, così ho pensato che avrei chiesto ...
Grazie mille @ dk14. È tardi, quindi andrò a preparare bene domani e voterò. È interessante notare che sto guardando [Scalaz State Monad] (https://www.youtube.com/watch?v=Jg3Uv_YWJqI) che mostra questa esatta situazione. Parafrasando il presentatore alle 18:40, la sintassi è una "lambda che prende una S e restituisce un SB, innalzato allo stato". –
Nell'esempio della tua domanda tale sollevamento da tipo semplice a monade (operatore "ritorno") è rappresentato da 'State.apply (run: S => (A, S))'. A proposito, è un video del 2012, il moderno scalaz non accetta il 'S => (A, S)' all'interno di 'State.apply' - lo sta facendo solo in [States.state (f: S => (S, A))] (http://scalaz.github.io/scalaz/scalaz-2.9.1-6.0.2/doc.sxr/scalaz/State.scala.html#40600) metodo, quindi c'è un solo un metodo di "ritorno". – dk14