等价于形式的Scalaz_

等价于形式的Scalaz_,scala,functional-programming,scalaz,Scala,Functional Programming,Scalaz,我只是在scalaz中玩了一下ST,说到这里,我想使用可遍历类型的内容来修改我的STRef。在Haskell中,我可以这样做(摘自Haskell wiki): sumST::Num a=>[a]->a sumST xs=runST$do n do modifySTRef n(+x) readSTRef n 不幸的是,我在scalaz中找不到表单的等价物。所以问题是,我怎样才能用scalaz做到这一点呢?正如你可能知道的,表单是mapM的翻页版本 您可以使用遍历和遍历(在Scalaz中实现),作

我只是在scalaz中玩了一下
ST
,说到这里,我想使用可遍历类型的内容来修改我的
STRef
。在Haskell中,我可以这样做(摘自Haskell wiki):

sumST::Num a=>[a]->a
sumST xs=runST$do
n do
modifySTRef n(+x)
readSTRef n

不幸的是,我在scalaz中找不到
表单
的等价物。所以问题是,我怎样才能用scalaz做到这一点呢?

正如你可能知道的,
表单是
mapM
的翻页版本

您可以使用
遍历
遍历
(在Scalaz中实现),作为
mapM
mapM
的通用版本

作为证明,请参见
Data.Traversable
traverse
的形式导出自己的
mapM
实现

sumST
的scalaz版本可能如下所示:

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)
  })
def sumST[S,A](as:List[A])(隐式A:Numeric[A]):ST[S,A]=
对于{n
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)
  })