标签: scala-cats

Scala Cats:在Aither上有一个确保方法吗?

我有关于Xor猫对象的这段代码

Xor.right(data).ensure(List(s"$name cannot be blank"))(_.nonEmpty)
Run Code Online (Sandbox Code Playgroud)

现在,因为Xor已被删除,我正在尝试使用Either对象编写类似的东西

Either.ensuring(name.nonEmpty, List(s"$name cannot be blank"))
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为确保的返回类型是 Either.type

我可以写一个if.但我想用猫结构进行验证.

scala scala-cats

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

将OOP"装饰器"重构为自由monad结构

我有一些"遗留的"Scala代码(类似Java),它可以进行一些数据访问.有一个装饰器跟踪DAO方法的使用(收集指标),如下所示:

class TrackingDao(tracker: Tracker) extends Dao {
    def fetchById(id: UUID, source: String): Option[String] = {
        tracker.track("fetchById", source) {
            actualFetchLogic(...)
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我试图把它塑造成一个免费的monad.我为DAO操作定义了以下代数:

sealed trait DBOp[A]
case class FetchById(id: UUID) extends DBOp[Option[String]]
...
Run Code Online (Sandbox Code Playgroud)

我看到两个选择:

a)我可以制作两个解释器DBOp,一个执行实际数据访问,另一个执行跟踪,并将它们组合在一起或者
b)我使跟踪成为一个显式代数,并使用Coproduct在同一个for组合中使用它们或者
c)完全不同的东西!

第一个选项看起来更像是一个"装饰器"方法,它与DBOp第二个选项相关,第二个选项是更通用的解决方案,但需要明确地调用"跟踪"代数.

另外,请注意source原始fetchById呼叫上的参数:它仅用于跟踪.我更愿意从API中删除它.

这是实际问题:如何建模跟踪?

functional-programming scala free-monad scala-cats

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

使用Cats组合不同类型的期货

我有不同类型的期货。

import cats.Cartesian
import cats.instances.future._
import cats.syntax.cartesian._
import scala.concurrent.Future
import cats.implicits._

val aF : Future[Either[X, Y]] = getFuture(...)
val bF : Future[Either[X, Y]] = getFuture(...)
val cF = Future[List[Long]] = getFuture2(...)

val combinedFuture = Cartesian.tuple3(aF, bF, cF)
combinedFuture match {case (a, b, c) => 
   ...
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误

Error:(36, 44) could not find implicit value for parameter cartesian: cats.Cartesian[scala.concurrent.Future]
      val combinedFuture = Cartesian.tuple3(aF, bF, cF)
Run Code Online (Sandbox Code Playgroud)

但是正如您所看到的,我已经导入了所有隐式,intances.future._和语法。

我在Scala 2.11.8上使用Cats 0.9.0

scala scala-cats

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

对Cats Effect IO进行认真评估并忘记行为

我正在将Future代码转换为IO。我有类似的代码

def doSomething: Future[Foo] = {
  Future { 
    //some code the result of which we don't care about 
  }
  Future {
    //Foo
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在程序结束时,我doSomething.unsafeRunSync。我如何将这些Futures 转换为IOs,同时保持第一个的即发即弃功能Future?在使用IO的异步API,我担心发生意外拦截时,我再打线程unsafeRunSyncdoSomething

scala scala-cats

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

如何对没有类型别名的Scala猫进行排序(参见牧羊猫)

我正在阅读Herding Cats

排序列表中的Traverse页面上的最后一个示例对我来说都失败了.

在示例中,他们这样做: -

scala> List(Right(1): Either[String, Int]).sequence
res5: Either[String,List[Int]] = Right(List(1))
scala> List(Right(1): Either[String, Int], Left("boom"): Either[String, Int]).sequence
res6: Either[String,List[Int]] = Left(boom)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试时,我收到以下错误: -

scala> import cats._, cats.data._, cats.implicits._
scala> val les = List(Right(3):Either[String,Int], Right(2):Either[String,Int])
scala> les.sequence
<console>:37: error: Cannot prove that Either[String,Int] <:< G[A].
les.sequence
   ^
Run Code Online (Sandbox Code Playgroud)

但是当我用类型别名帮助编译器来修复Left类型时,一切都很好: -

scala> type XorStr[X] = Either[String,X]
defined type alias XorStr

scala> val les = List(Right(3):XorStr[Int], Right(2):XorStr[Int])
les: List[XorStr[Int]] = List(Right(3), Right(2))

scala> les.sequence
res0: XorStr[List[Int]] = Right(List(3, …
Run Code Online (Sandbox Code Playgroud)

scala traversal scala-cats

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

Scala FlatMap和Applicative上下文边界会产生编译错误

我在Scala做了一些工作人员并遇到了implicit实例问题.让我们考虑以下示例:

import cats.{Applicative, FlatMap, Monad}
import cats.syntax.functor._
import cats.syntax.flatMap._
import cats.syntax.applicative._


class Test[F[_]: Monad] extends App{
  val t1 = ().pure[F]
  val t2 = ().pure[F]

  def testFlatApplicative: F[Unit] =
    for{
      _ <- t1
      _ <- t2
    } yield ()
}
Run Code Online (Sandbox Code Playgroud)

编译好了.但由于cats.Monad[F[_]]声明如下:

@typeclass trait Monad[F[_]] extends FlatMap[F] with Applicative[F]
Run Code Online (Sandbox Code Playgroud)

我希望以下内容也能正常运行

import cats.{Applicative, FlatMap, Monad}
import cats.syntax.functor._
import cats.syntax.flatMap._
import cats.syntax.applicative._


class Test[F[_]: FlatMap : Applicative] extends App{
  val t1 = ().pure[F]
  val t2 = ().pure[F]

  def testFlatApplicative: F[Unit] …
Run Code Online (Sandbox Code Playgroud)

functional-programming scala scala-cats

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

斯卡拉猫:读者组成

import cats.data.ReaderT
import cats.instances.either._

trait Service1
trait Service2
case class Cats(name:String)

type FailFast[A] = Either[List[String], A]
type Env = (Service1, Service2, Cats)
type ReaderEnvFF[A] = ReaderT[FailFast, Env, A]

def toReaderEnvFF[A](input:A):ReaderEnvFF[A] =
  ReaderT((_:Env) => Right(input))

def c:ReaderEnvFF[Cats] =
  for {
    cats <- toReaderEnvFF((_:Env)._3)
  } yield cats   // This line is 26
Run Code Online (Sandbox Code Playgroud)

错误:

错误:(26,11)类型不匹配;找到:T1.this.Env => com.savdev.Cats(展开为)(((com.savdev.Service1,com.savdev.Service2,com.savdev.Cats)))=> com.savdev.Cats需要的猫:com .savdev.Cats}产生猫

您能解释一下,为什么猫不是com.savdev.Cats吗?以及为什么在错误中说它被扩展为具有return方法的功能[Cats],而不是botFailFast[Cats]

我尝试应用与此处完全相同的逻辑:

trait Service1 { def s1f = Option(10) }
trait Service2 {
  type ReaderS1[A] = ReaderT[Option,Service1,A]
  import cats.syntax.applicative._ …
Run Code Online (Sandbox Code Playgroud)

scala for-comprehension reader-monad scala-cats

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

从F [A]创建ReaderT [F,D,A]

type MapReaderOrOption[A] = ReaderT[Option, Map[String,String], A]
Run Code Online (Sandbox Code Playgroud)

我可以从创建它ReaderT.apply

def f:MapReaderOrOption[Int] = ReaderT(_ => Option(10))
Run Code Online (Sandbox Code Playgroud)

从A类型通过类型丰富和纯方法:

import cats.Applicative
import cats.syntax.int._
def f:MapReaderOrOption[Int] = 10.pure[MapReaderOrOption]
Run Code Online (Sandbox Code Playgroud)

我想找到类似的东西。每次使用ReaderT(..)都不那么方便。当然,我可以创建一个辅助方法。问题是,还有其他选择吗?

预期类似:

def f:MapReaderOrOption[Int] = Option(10).asReaderT[MapReaderOrOption]
Run Code Online (Sandbox Code Playgroud)

scala reader-monad scala-cats

3
推荐指数
2
解决办法
103
查看次数

如何从Cats State创建Cats IO monad

我正在与猫打交道,我想将其转换val x: State[A, B]为猫StateT[IO, A, B]。注意:IO来自猫的效果。
如何优雅地做到这一点?

scala scala-cats cats-effect

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

Scala中的功能库(如Cats和ScalaZ)中的类型类与数据类型

ScalaZ和Cats都具有类型类和数据类型的概念。

尽管我了解类型类和类型类实例,但我不理解它们对术语“数据类型”的使用

类似KleisiEither称为“数据类型”的东西 -为什么?我的理解是,它们是使用这些类型类“可能”实现的通用功能,但是,即使在Scala的FP Programing一书中,它们也不被称为“数据类型”

我想知道这个词是从哪里来的?

例子:

scala scalaz scala-cats

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