Hi All,
I am learning scalaz by reading below blog:
http://eed3si9n.com/learning-scalaz/State.html
But i am confused by below sample. There is no input parameter defined in the stackManip method signiture, why we can use it like: stackManip(List(5, 8, 2, 1)) ?? I think I must missed some key point of
StateT[Id, S, A]
import scalaz._
import Scalaz._
type Stack = List[Int]
val pop = State[Stack, Int] {
case x :: xs => (xs, x)
}
def push(a: Int) = State[Stack, Unit] {
xs => (a :: xs, ())
}
def stackManip: State[Stack, Int] = for {
_ <- push(3)
a <- pop
b <- pop
} yield(b)
stackManip(List(5, 8, 2, 1))
Thanks for any tips
stackManip
is of type State[Stack, Int]
, which has an apply
method. In scala, if you have some type with an apply method, you can omit apply
, and make it look like a method call.
stackManip(List(5, 8, 2, 1))
is the same as stackManip.apply(List(5, 8, 2, 1))
. Apply is implemented below:
trait StateT[F[+_], S, +A] { self =>
/** Run and return the final value and state in the context of `F` */
def apply(initial: S): F[(S, A)]
/** An alias for `apply` */
def run(initial: S): F[(S, A)] = apply(initial)
/** Calls `run` using `Monoid[S].zero` as the initial state */
def runZero(implicit S: Monoid[S]): F[(S, A)] =
run(S.zero)
}
1 Like
Hi Martijnhoekstra
Thanks a lot for crystal clear explanation.