【发布时间】:2021-06-05 14:34:48
【问题描述】:
我在 Scala 中有以下代数(我使用的是无标记最终模式):
trait ShoppingCarts[F[_]] {
def create(id: String): F[Unit]
def find(id: String): F[Option[ShoppingCart]]
def add(sc: ShoppingCart, product: Product): F[ShoppingCart]
}
使用上面的代数,我创建了以下程序:
def createAndToCart[F[_] : Monad : ShoppingCarts](product: Product, cartId: String): F[Option[ShoppingCart]] =
for {
_ <- ShoppingCarts[F].create(cartId)
maybeSc <- ShoppingCarts[F].find(cartId)
maybeNewScF = maybeSc.map(sc => ShoppingCarts[F].add(sc, product))
maybeNewSc <- maybeNewScF match {
case Some(d) => d.map(s1 => Option.apply(s1))
case _ => Monad[F].pure(Option.empty[ShoppingCart])
}
} yield maybeNewSc
我不太喜欢 for-comprehension 构造中将Option[F[ShoppingCart]] 转换为F[Option[ShoppingCart]] 的代码。我确信我可以做得更好,但我不知道如何改进它。
我正在使用猫。
【问题讨论】:
标签: scala functional-programming scala-cats cats-effect tagless-final