标签: scala-cats

Scala - 如何结合EitherT和Either in For Comprehension

假设我有以下设置:

def foo: Either[Error, A] = ???
def bar: EitherT[Future, Error, B] = ???
case class Baz(a: A, b: B)
Run Code Online (Sandbox Code Playgroud)

我如何使用理解来实例化类Baz?我试过:

val res = for {
  a <- foo
  b <- bar
} yield Baz(a, b)
Run Code Online (Sandbox Code Playgroud)

但是,结果有类型Either[Error, Nothing]。我不知道在这种情况下什么是正确的返回类型,但显然我不想Nothing......

结合EitherEitherT理解的正确方法是什么?

scala scala-cats

1
推荐指数
1
解决办法
1851
查看次数

IO Monad 与 Reader Monad

我想知道 IO Monad 和 Reader monad 之间有什么关系吗?

Reader monad 中的环境可以产生效果吗?如果是这样,ZIO 或 Cats IO、scalaz-effects 如何处理 Reader Monad 原则?

scalaz scala-cats cats-effect zio

1
推荐指数
1
解决办法
699
查看次数

Scala中的Cats之外是否有任何三元等于===方法?

我花了一段时间在Google上搜索了非猫三重等于方法,但除了Scalaz找不到任何东西。不幸的是,我无法===在此库中计算出导入。

有人可以帮忙,非常感谢。

scala equals scalaz triple-equals scala-cats

1
推荐指数
1
解决办法
143
查看次数

猫的匹配器EitherT和效果

我是猫和函数式编程的新手,我正在努力进行单元测试函数数据类型,如EitherT. 有示例代码:

class Library[F[_]]() {
    def create(book: Book)(implicit M: Monad[F]): EitherT[F, BookAlreadyExistsError, Book] = ...
}
Run Code Online (Sandbox Code Playgroud)

我想使用 Spec2 对其进行测试,但我不知道如何正确进行。尝试过这样的事情,但它不起作用:

  val library = Library[IO]()

  test("create book") {

    val book = Book("Title 1", 2016, "author 1")
    (for (
      resultBook <- library.create(book)
    ) yield resultBook shouldEqual ???
    ).unsafeRunSync()

  }
Run Code Online (Sandbox Code Playgroud)

我想有这样的非常简单的断言:

   resultBook shouldEqual Right(Book("Title 1", 2016, "author 1"))
   // or
   resultBook shouldEqual Left(BookAlreadyExistsError)
Run Code Online (Sandbox Code Playgroud)

functional-programming scala specs2 scala-cats cats-effect

1
推荐指数
1
解决办法
335
查看次数

猫:在没有类型别名的情况下实现谓词逆变?

假设谓词是一个函数 A => Boolean,我想为谓词实现 Cats 的“逆变函子”类型类的实例。我还有一个隐式类 PredicateOps,它定义谓词的并集和相交运算符。

我已经能够使用类型别名使实例正常工作:

type Predicate[A] = A => Boolean

implicit val predicateContra = new Contravariant[Predicate] {
  override def contramap[A, B](fa: Predicate[A])(f: B => A): Predicate[B] =
    (b: B) => fa(f(b))
}
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我必须将所有谓词函数强制为别名,如下所示:

val even: Predicate[Int] = (i: Int) => i % 2 == 0
Run Code Online (Sandbox Code Playgroud)

我觉得这很烦人。所以我想知道是否可以不使用类型别名,而是直接为 Function1 从类型变量 A 到 Boolean 定义 predicateContra,但我无法让它工作。以下两种想法都会给我带来编译器错误:

implicit val predicateContra = new Contravariant[Function1[_, Boolean]] {
// "Function1[_, Boolean] takes no type parameters, expected: one"

implicit def predicateContra[A] = new Contravariant[Function1[A, …
Run Code Online (Sandbox Code Playgroud)

functional-programming scala functor type-level-computation scala-cats

1
推荐指数
1
解决办法
406
查看次数

如何避免无参数案例类?

我有以下代码片段,我想改进:

final case class GenderOps[F[_]]()
                                (implicit xa: Transactor[F],
                                 ev: Bracket[F, Throwable]) extends GenderDb[F] {
  override def create: F[Int] =
    sql"""
    CREATE TABLE interests
    (
      id smallserial NOT NULL,
      interest character varying(40) NOT NULL,
      PRIMARY KEY (id)
    )
    """.update.run.transact(xa)

  override def seed[L[_] : Foldable](v: L[Gender]): F[Int] = ???
Run Code Online (Sandbox Code Playgroud)

正如您在代码中看到的,case class参数为空。可以避免case class吗?

scala scala-cats

1
推荐指数
1
解决办法
85
查看次数

与 cats 并行压缩两个 EitherT[Future, _, _]

scala 中的常规 future 提供了zip运算符。当两者都成功时,它将结合它们的价值并并行运行它们。当有两只猫时,猫身上是否有类似的东西EitherT[Future, _, _]


val a: EitherT[Future, String, Int] = EitherT.right(10)
val b: EitherT[Future, String, Int] = EitherT.right(20)
val sum: EitherT[Future, String, Int] = for ((a, b) <- a zip b) yield a + b
Run Code Online (Sandbox Code Playgroud)

我希望sum是一个Right(30)whenab都是两个Right值。此外,与该Future.zip函数一样,两个 future 应该并行运行:

scala scala-cats

1
推荐指数
1
解决办法
546
查看次数

在功能域设计中使用 Free Monad

我对函数式编程很陌生。但是,我阅读了有关 Free Monad 的文章,并且正在尝试在玩具项目中使用它。在这个项目中,我对股票的投资组合域进行建模。正如许多书中所建议的那样,我为 定义了 PortfolioService一个代数,为PortfolioRepository.

我想在PortfolioRepository代数和解释器的定义中使用 Free monad 。目前,我没有PortfolioService根据 Free monad 来定义代数。

但是,如果我这样做,在PortfolioService解释器中,PortfolioRepository由于使用的 monad 不同,我无法使用 the 的代数。例如,我不能使用 monads Either[List[String], Portfolio],并且Free[PortfolioRepoF, Portfolio]在同一个for-comprehension 中:(

我怀疑如果我开始使用 Free monad 来模拟代数,那么所有其他需要与它组合的代数都必须根据 Free monad 来定义。

这是真的吗?

我正在使用 Scala 和 Cats 2.2.0。

functional-programming scala free-monad scala-cats

1
推荐指数
1
解决办法
164
查看次数

函数定义中返回类型后的大括号

在阅读cats库的Functor源码时,无法理解toFunctorOps函数返回类型后的curl块是做什么的;我的猜测是这个块将作为构造函数的一部分执行?如果是这样,那么,为什么类型TypeClassType与相同的代码定义了两次类型TypeClassType =函子[F]

  trait Ops[F[_], A] extends Serializable {
    type TypeClassType <: Functor[F]
    def self: F[A]
    val typeClassInstance: TypeClassType
    def map[B](f: A => B): F[B] = typeClassInstance.map[A, B](self)(f)
    ...
  }

  trait ToFunctorOps extends Serializable {
    implicit def toFunctorOps[F[_], A](target: F[A])(implicit tc: Functor[F]): Ops[F, A] {
      type TypeClassType = Functor[F]
    } =
      new Ops[F, A] {
        type TypeClassType = Functor[F]
        val self: F[A] = target
        val typeClassInstance: TypeClassType = tc
      }
  }
Run Code Online (Sandbox Code Playgroud)

scala scala-cats

1
推荐指数
1
解决办法
52
查看次数

Scala、Circe、Json - 如何从 json 中删除父节点?

我有一个像这样的json结构:

"data" : {
  "fields": {
    "field1": "value1",
    "field2": "value2"
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想删除fields节点并将数据保留在data

"data" : {
   "field1": "value1",
   "field2": "value2"
 }
Run Code Online (Sandbox Code Playgroud)

我试着这样做:

val result = data.hcursor.downField("fields").as[JsonObject].toOption.head.toString
Run Code Online (Sandbox Code Playgroud)

但我得到了一个奇怪的结果,而不仅仅是字符串格式的 json

我也试过:

val result = data.hcursor.downField("fields").top.head.toString
Run Code Online (Sandbox Code Playgroud)

但它是一样的:

val result = data.toString
Run Code Online (Sandbox Code Playgroud)

它包括fields.

我应该如何更改我的代码以删除fieldsroot 并将数据保留在data属性下?

json scala scala-cats circe

1
推荐指数
1
解决办法
69
查看次数