Contents
hide
ZIO
实例
如果您是 Scalaz 7.2 的忠实用户,那么 interop-scala7x 模块为它的几种类型类提供了 ZIO 支持,请查看源代码以获取更多详细信息。
例子
import scalaz._, Scalaz._
import zio.interop.scalaz72._
type Database = IList[User]
def findUser(id: UserId): ZIO[Database, UserError, User] = ...
def findUsers(ids: IList[UserId]): ZIO[Database, UserError, IList[User]] = ids.traverse(findUser(_))
通过 ZIO
并行执行 Applicative
实例
由于 Applicative
和 Monad
相关的法则,ZIO 的 Applicative
实例必须通过 bind
来获得,因此组合多个 Applicative
effect 时将只能串行获得。为了解除这个限制,ZIO 通过非 Monad 的标记(Tag)来并行执行 Applicative
实例。
例子
import scalaz._, Scalaz._
import zio.interop.scalaz72._
case class Dashboard(details: UserDetails, history: TransactionHistory)
def getDetails(id: UserId): ZIO[Database, UserError, UserDetails] = ...
def getHistory(id: UserId): ZIO[Database, UserError, TransactionHistory] = ...
def buildDashboard(id: UserId): ZIO[Database, UserError, Dashboard] =
Tag.unwrap(^(par(getDetails(id)), par(getHistory(id)))(Dashboard.apply))
def par[R, E, A](io: ZIO[R, E, A]): scalaz72.ParIO[R, E, A] = Tag(io)