如何将ZIO[R, Nothing, Boolean]转换为UIO[Boolean]?ZIO编译报错求助
问题分析与解决
错误原因
你遇到的类型不匹配问题核心在于ZIO的环境类型约束:
UIO[Boolean]是ZIO[Any, Nothing, Boolean]的别名,代表这个ZIO不需要任何环境依赖(Any),也不会失败(Nothing)。- 而
getLastNameZio的返回类型是URIO[R with ZMetrics with ZEnv, String](等价于ZIO[R with ZMetrics with ZEnv, Nothing, String]),意味着它依赖R、ZMetrics和ZEnv这几个环境。
当你用for推导式组合这两个ZIO时,最终生成的ZIO会继承getLastNameZio的环境依赖,也就是ZIO[R with ZMetrics with ZEnv, Nothing, Boolean],但你给doWork声明的返回类型是UIO[Boolean](要求环境是Any),两者类型不兼容,所以编译器报错。
另外你提到必须用for推导式是对的:getLastNameZio返回的是ZIO容器,只有通过for推导式(本质是flatMap/map)才能提取出内部的String类型值,直接把ZIO传给isLastNameSmith肯定会类型错误。
解决方案
有两种方式可以解决这个问题:
方案1:调整返回类型匹配实际依赖
把doWork的返回类型改成和推导结果一致的类型:
def doWork(firstName: String): URIO[R with ZMetrics with ZEnv, Boolean] = { for { lastName <- getLastNameZio(firstName) isSmithFamily = isLastNameSmith(lastName) } yield isSmithFamily }
方案2:消除不必要的环境依赖
看你的getLastNameZio实现,它只是返回UIO(不需要任何环境),所以可以修改它的返回类型,去掉多余的环境约束:
def getLastNameZio(firstName: String): UIO[String] = { if (firstName == "bob") UIO("builder") else UIO("smith") } // 此时doWork的返回类型UIO[Boolean]就可以正常通过编译 def doWork(firstName: String): UIO[Boolean] = { for { lastName <- getLastNameZio(firstName) isSmithFamily = isLastNameSmith(lastName) } yield isSmithFamily }
内容的提问来源于stack exchange,提问作者stackoverflowflowflwofjlw
相关产品推荐
相关产品推荐

