gpt4 book ai didi

scala - 用 For-Comprehension 重写模式匹配

转载 作者:行者123 更新时间:2023-12-01 07:55:09 25 4
gpt4 key购买 nike

给定以下类型:

sealed trait Pet { 
val name: String
}
case class Dog(override val name: String) extends Pet
case class Cat(override val name: String) extends Pet

sealed trait Error
case object DBConnection extends Error
case object NoResults extends Error

我们编写了一个按宠物名称搜索宠物的函数。
def foo(petName: String): Either[Error, Pet] = {
val results: Either[Error, List[Pet]] = ??? // does not matter
val foundPet: Option[Pet] = results match {
case left @ Left(_) => None
case Right(ps) => ps.find(_.name == petName)
}
foundPet match {
case None => Left(NoResults)
case Some(p) => Right(p)
}
}

请忽略上述代码对数据库调用的任何改进。

理想情况下,我更愿意将上面的代码写成一个简单的 for comprehension ,利用 Either单子(monad)。我相信,模式匹配很容易阅读,但是 for我怀疑,替代方案会更简洁。

我将如何用理解重写上述代码?我想我可以只创建与返回类型匹配的方法 Either[Error, Pet] ,但不确定。

最佳答案

问题是 Scala Either不是单子(monad),也没有偏见,因此您不能在理解中使用它:您必须首先获得 LeftProject 或 RightProjection,正如其他海报提到的那样。

如果您愿意接受 scalaz .斯卡拉兹 disjunction ( \/ ) 是右偏并遵循所有单子(monad)定律。当你 map在它上面它给你right值(value)。

所以你的类型会变成

 val results : \/[Error,List[Pet]]

results.map会给你 List[Pet]因为scalaz析取是右偏的。

this也可能有帮助

关于scala - 用 For-Comprehension 重写模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29542450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com