等价于形式的Scalaz_
我只是在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中实现),作
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)
})