您可能知道,forM_
它是mapM_
.
您可以使用traverse
and traverse_
(在 Scalaz中mapM
实现)作为and的通用版本mapM_
。
作为证明,请参阅Data.Traversable
export 其自己的实现mapM
,就 而言traverse
。
scalaz 版本sumST
可能如下所示:
def sumST[S, A](as: List[A])(implicit A: Numeric[A]): ST[S, A] =
for { n <- newVar(A.zero)
_ <- as.traverseU(a => n.mod(A.plus(_, a)))
m <- n.read } yield m
def sum[A : Numeric](as: List[A]): A =
runST(new Forall[({type λ[S] = ST[S, A]})#λ] {
def apply[S] = sumST[S, A](as)
})
对于想知道为什么它比 haskell 版本详细得多的读者:我们必须使用Forall
trait 来表示 Scala 中的 rank-2 多态类型。有关更完整的解释,请参阅http://apocalisp.wordpress.com/2011/03/20/towards-an-effect-system-in-scala-part-1/。