scala – K / Kestrel Combinator for monads?
发布时间:2020-12-16 08:44:45 所属栏目:安全 来源:网络整理
导读:implicit class KComb[A](a: A) { def K(f: A = Any): A = { f(a); a }} 鉴于K组合子的这种实现,我们可以在应用副作用的同时对值进行链接方法调用,而不需要临时变量. 例如.: case class Document()case class Result()def getDocument: Document = ???def p
implicit class KComb[A](a: A) { def K(f: A => Any): A = { f(a); a } } 鉴于K组合子的这种实现,我们可以在应用副作用的同时对值进行链接方法调用,而不需要临时变量. case class Document() case class Result() def getDocument: Document = ??? def print(d: Document): Unit = ??? def process(d: Document): Result = ??? val result = process(getDocument.K(print)) // Or,using the thrush combinator // val result = getDocument |> (_.K(print)) |> process 现在,我需要做类似的事情,但改为使用IO monad. def getDocument: IO[Document] = ??? def print(d: Document): IO[Unit] = ??? def process(d: Document): IO[Result] = ??? 我的问题是:这个操作的组合器是否已存在? Scalaz或者其他一些库中有什么可以做到的吗? 我找不到任何东西,所以我自己为monad推出了这个K组合变体. 但是我仍然想知道是否已经存在这种类型的东西,我只是重新发明轮子. implicit class KMonad[M[_]: Monad,A](ma: M[A]) { def tapM[B](f: A => M[B]): M[A] = for { a <- ma _ <- f(a) } yield a } // usage getDocument tapM print flatMap process 解决方法
编辑:我的初步答案是错误的.这是正确的.
在猫的FlatMap上有一个flatTap方法,>>!在scalaz的BindOps上. getDocument flatTap print >>= process getDocument >>! print >>= process 编辑^ 2:将flatMap更改为>> =以更轻松地显示点击和绑定之间的关系. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |