加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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/.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读