Scala 在一个文档中组合多个不同的monad类型以供理解

Scala 在一个文档中组合多个不同的monad类型以供理解,scala,slick,Scala,Slick,上一个标题:在中编写DBIOs以供理解 我不明白,为什么下面的代码甚至没有编译 我想做什么/Context 对于电影门票销售条目列表中的每个条目,如果在我的数据库中找到该电影,请将其插入 问题似乎是,我无法在中使用DBIO进行理解。为什么呢?是因为我在同一个地方使用不同类型的单子来理解吗 val movieticketsalenumber:List[MovieTicketSale]=cinemapi.allMovieTicketSales val insertMetricActions:列表[D

上一个标题:在中编写DBIOs以供理解

我不明白,为什么下面的代码甚至没有编译

我想做什么/Context

对于电影门票销售条目列表中的每个条目,如果在我的数据库中找到该电影,请将其插入

问题似乎是,我无法在中使用DBIO进行理解。为什么呢?是因为我在同一个地方使用不同类型的单子来理解吗

val movieticketsalenumber:List[MovieTicketSale]=cinemapi.allMovieTicketSales
val insertMetricActions:列表[DBIO[UUID]]=for{

movieTicketSaleNumber:MovieTicketSale是的,这是因为你在理解中使用了不同类型的单子

想想不加修饰的版本。用于理解的Scala可归结为一系列
map
flatMap
调用。
flatMap
的类型基本上是这样定义的:

def flatMap[F[_], A, B](item: F[A])(fn: A => F[B]): F[B]
请注意,当内部类型更改时,包装类型始终为相同的类型F。在这里,您将DBIO效果类型与同一类型中的用于理解的选项混合在一起——这违反了flatMap的定义

在您的情况下,如果您想将整个内容保存在
中以便理解,您可以尝试使用Cats提供的
OptionT
monad transformer:。
OptionT
基本上提供了一个包装器,允许您处理一元值
F[Option[\u]]
本身是一个一元值。请注意,您还有一个列表,它是第三个一元类型。因此,您的计算结果可能如下所示:

import cats._
import cats.data._
import cats.implicits._

val movieTicketSaleNumbers: List[MovieTicketSale] = cinemaApi.allMovieTicketSales

def insertTicket(sale: MovieTicketSale): OptionT[DBIO, UUID] = 
  for {
    movie <- OptionT(moviesDb.findOneExact(sale.movie.id))
    movieNumberDbId <- OptionT.liftF(insertMovieTicketSale(sale, movie))
  } yield movieNumberDbId

val insertMetricActions: List[DBIO[Option[UUID]]] = movieTicketSaleNumbers.map(insertTicket(_).value)
导入猫_
导入cats.data_
进口猫_
val movieticketsalenumber:List[MovieTicketSale]=cinemapi.allMovieTicketSales
def insertTicket(销售:MovieTicketSale):OptionT[DBIO,UUID]=
为了{

电影是的,这是因为你在阅读中使用了不同类型的单子

想想不加修饰的版本。用于理解的Scala可归结为一系列
map
flatMap
调用。
flatMap
的类型基本上是这样定义的:

def flatMap[F[_], A, B](item: F[A])(fn: A => F[B]): F[B]
请注意,当内部类型更改时,包装类型始终为相同的类型F。在这里,您将DBIO效果类型与同一类型中的用于理解的选项混合在一起——这违反了flatMap的定义

在您的情况下,如果您想将整个内容保存在
中以便理解,您可以尝试使用Cats提供的
OptionT
monad transformer:。
OptionT
基本上提供了一个包装器,允许您处理一元值
F[Option[\u]]
本身是一个一元值。请注意,您还有一个列表,它是第三个一元类型。因此,您的计算结果可能如下所示:

import cats._
import cats.data._
import cats.implicits._

val movieTicketSaleNumbers: List[MovieTicketSale] = cinemaApi.allMovieTicketSales

def insertTicket(sale: MovieTicketSale): OptionT[DBIO, UUID] = 
  for {
    movie <- OptionT(moviesDb.findOneExact(sale.movie.id))
    movieNumberDbId <- OptionT.liftF(insertMovieTicketSale(sale, movie))
  } yield movieNumberDbId

val insertMetricActions: List[DBIO[Option[UUID]]] = movieTicketSaleNumbers.map(insertTicket(_).value)
导入猫_
导入cats.data_
进口猫_
val movieticketsalenumber:List[MovieTicketSale]=cinemapi.allMovieTicketSales
def insertTicket(销售:MovieTicketSale):OptionT[DBIO,UUID]=
为了{

电影《非常感谢你》@lawrence。我已经计划接触猫一段时间了,所以这很好。不过,出于学习目的,你介意分享一下香草Scala的效果吗?嗨@SamBokai,我更新了我的答案,加入了香草Scala的方式。它不那么优雅,我相信有更好的表达方式唱这首歌,但希望它能散发出一些光芒。现在我已经看到了这首歌,它是如此的明显……非常感谢。猫看起来很棒。非常感谢你@lawrence。我已经计划好了一段时间了,所以这首歌很棒。不过,出于学习的目的,你介意和我分享一下香草斯卡拉的味道吗?嗨@SamBokai,我更新了m我的答案是用香草斯卡拉做的。它不那么优雅,我相信有更好的表达方式,但希望它能散发出一些光芒。这很明显,我已经看过了…非常感谢。猫看起来很棒