Scalaz相当于forM_
发布时间:2020-12-16 19:15:29 所属栏目:安全 来源:网络整理
导读:我只是在 scalaz中玩了一点ST并且到了这一点,我想使用可遍历类型的内容来修改我的STRef.在 Haskell中我可以这样做(取自Haskell wiki): sumST :: Num a = [a] - asumST xs = runST $do n - newSTRef 0 forM_ xs $x - do modifySTRef n (+x) readSTRef n 不
我只是在
scalaz中玩了一点ST并且到了这一点,我想使用可遍历类型的内容来修改我的STRef.在
Haskell中我可以这样做(取自Haskell wiki):
sumST :: Num a => [a] -> a sumST xs = runST $do n <- newSTRef 0 forM_ xs $x -> do modifySTRef n (+x) readSTRef n 不幸的是,我无法在scalaz中找到forM_的等价物.所以问题是,我怎么能用scalaz做到这一点? 解决方法
您可能知道,forM_是mapM_的翻转版本.
您可以使用traverse和traverse_(在Scalaz中实现),作为mapM和mapM_的通用版本. 作为证明,请参阅遍历方面的Data.Traversable导出其自己的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) }) 对于读者来说,想知道为什么它比haskell版本更冗长:我们必须使用Forall特性来表示Scala中的rank-2多态类型.有关更全面的解释,请参阅http://apocalisp.wordpress.com/2011/03/20/towards-an-effect-system-in-scala-part-1/. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |