标签: scala-cats

为什么 Scala Cats 使用类型类而不是继承?

使用类型类而不是继承有什么意义?

Monad这是一个通过上下文绑定使用类型类的函数:

def f[A : Monad](x:A) = ??? 
Run Code Online (Sandbox Code Playgroud)

(是的,我们现在有了 flatMap 方法)

然而,这使用了带有子类型绑定的继承:

def f[A <: Monad](x:A) = ???  
f(x) // where x is a CatsList which implements Monad trait.
Run Code Online (Sandbox Code Playgroud)

(我们现在还获得了 flatMap 方法。)

难道两者没有达到同样的目的吗?

inheritance functional-programming scala typeclass scala-cats

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

如何转为精致型?

我正在使用库https://github.com/fthomas/refined并希望转换java.util.UUID为精炼的Uuid.
如何转为java.util.UUID精炼Uuid

更新

我有以下 http 路由:

  private val httpRoutes: HttpRoutes[F] = HttpRoutes.of[F] {
    case GET -> Root / UUIDVar(id) =>
      program.read(id)
Run Code Online (Sandbox Code Playgroud)

读取函数定义如下:

  def read(id: Uuid): F[User] =
    query
      .read(id)
      .flatMap {
        case Some(user) =>
          Applicative[F].pure(user)
        case None =>
          ApplicativeError[F, UserError].raiseError[User](UserNotRegistered)
      }
Run Code Online (Sandbox Code Playgroud)

编译器抱怨:

type mismatch;
[error]  found   : java.util.UUID
[error]  required: eu.timepit.refined.string.Uuid
[error]       program.read(id)
[error]         

       ^
Run Code Online (Sandbox Code Playgroud)

scala scala-cats http4s refined

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

更改 fs2.Stream 的效果类型

我正在使用 doobie,它可以生成fs2.Stream[ConnectionIO, Int]数据库行(Int在我的例子中)。这ConnectionIO[A]是 doobie 的内部类型。

给定了 HKT F[_]val nt: ConnectionIO ~> F有什么办法可以到达fs2.Stream[F, Int]fs2.Stream[ConnectionIO, Int]

我没有找到某种mapK定义的fs2.Stream.

functional-programming scala scala-cats fs2

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

`F[_]: Sync` 中的 `F` 是什么?它来自哪里?

我想使用该存储库中的 cats-saga:https://github.com/VladKopanev/cats-saga

然而我被困在这段代码上OrderSagaCoordinator.scala L160

def apply[F[_]: Sync: Concurrent: Timer: Sleep: Parallel](
    paymentServiceClient: PaymentServiceClient[F],
    loyaltyPointsServiceClient: LoyaltyPointsServiceClient[F],
    orderServiceClient: OrderServiceClient[F],
    sagaLogDao: SagaLogDao[F],
    maxRequestTimeout: Int
  ): F[OrderSagaCoordinatorImpl[F]] =
Run Code Online (Sandbox Code Playgroud)

它是什么F,它从哪里来,有人可以解释一下那段代码吗?

谢谢

编辑:我知道什么是通用类型。然而,在这种情况下apply,调用该方法时不会指定具体类型,而且我看不到它来自的任何地方。

(for {
      paymentService <- PaymentServiceClientStub(randomUtil, clientMaxReqTimeout, flakyClient)
      loyaltyPoints  <- LoyaltyPointsServiceClientStub(randomUtil, clientMaxReqTimeout, flakyClient)
      orderService   <- OrderServiceClientStub(randomUtil, clientMaxReqTimeout, flakyClient)
      xa             = Transactor.fromDriverManager[IO]("org.postgresql.Driver", "jdbc:postgresql:Saga", "postgres", "root")
      logDao         = new SagaLogDaoImpl(xa)
      orderSEC       <- OrderSagaCoordinatorImpl(paymentService, loyaltyPoints, orderService, logDao, sagaMaxReqTimeout)

    // ...
Run Code Online (Sandbox Code Playgroud)

generics scala typeclass higher-kinded-types scala-cats

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

如何在 Scala 中组合 ADT?

我的应用程序有两层:域和应用程序。每层都有自己的“错误”ADT。例如:

package com.domain.person

sealed trait DomainError
case object NoPermission extends DomainError

final case class Person(hasPermission: Boolean): Either[DomainError, ???] {
  def doSomething() = {
    if (!hasPermission)
      Left(NoPermission)
    else
      ...
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序层(另一个包)中:

package com.application.person

sealed trait ApplicationError
case object PersonNotFound extends ApplicationError
case object UnexpectedFatalError extends ApplicationError

// and a function f :: Either ApplicationError Something
Run Code Online (Sandbox Code Playgroud)

问题是,由于DomainError生活在另一个包中,我不能简单地扩展我的ApplicationError特征:

package com.application.person

sealed trait ApplicationError
case object PersonNotFound extends ApplicationError
case object UnexpectedFatalError extends ApplicationError

// and a function f …
Run Code Online (Sandbox Code Playgroud)

scala scala-cats

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

导入FlatMap实例中断应用程序构建器语法

对于我的示例,我将使用Options,但在我的实际代码中,我使用的是自定义数据类型.添加导入import cats.std.option._将解决示例中的问题.我有一些看起来像这样的代码:

import cats.{FlatMap, Eval, Applicative}
import cats.data.Kleisli
import cats.syntax.all._

implicit val optionApplicative = new Applicative[Option] {
  override def pure[A](x: A): Option[A] = Option(x)
  override def ap[A, B](fa: Option[A])(f: Option[(A) => B]): Option[B] = for {
    a <- fa
    fUnwrapped <- f
  } yield fUnwrapped(a)
}

val test : Option[(Int, String)] = (Option(4) |@| Option("name")).map((_, _))
Run Code Online (Sandbox Code Playgroud)

这段代码编译运行得很好.

接下来我曾经Kleisli写过一些返回的函数Option:

val test2 : List[Int] => Option[Int] = {
  val f = (xs : List[Int]) …
Run Code Online (Sandbox Code Playgroud)

scala implicit scala-cats

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

值| @ | 不是cats.data.Validated的成员

当我使用猫0.9.0时我很容易做到

import cats.data.Validated
import cats.data.Validated._
import cats.syntax.all._
import cats.implicits._
val x = Validated.valid[List[String], Int](10)
val y = Validated.valid[List[String], Int](20)
x |@| y 
Run Code Online (Sandbox Code Playgroud)

这很好用.但对于我的项目,我必须使用Cats 0.7.2.

当我尝试与猫0.7.2相同的代码然后这相同的代码不起作用,我得到错误消息 value |@| is not a member of cats.data.Validated

scala scala-cats

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

如何将Scala Cat's Kleisli与任何一种一起使用

我正在尝试使用Kleisli编写返回monad的函数。它适用于Option:

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

object KleisliOptionEx extends App {
  case class Failure(msg: String)
  sealed trait Context
  case class Initial(age: Int)                                   extends Context
  case class AgeCategory(cagetory: String, t: Int)                    extends Context
  case class AgeSquared(s: String, t: Int, u: Int)             extends Context

  type Result[A, B] = Kleisli[Option, A, B]
  val ageCategory: Result[Initial,AgeCategory] =
    Kleisli {
      case Initial(age) if age < 18 => {
        Some(AgeCategory("Teen", age))
      }
    }

  val ageSquared: Result[AgeCategory, AgeSquared] = Kleisli {
      case AgeCategory(category, age) =>  Some(AgeSquared(category, age, age …
Run Code Online (Sandbox Code Playgroud)

scala either kleisli scala-cats

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

将列表[[[A,B]之一]扁平化到列表[B],像列表[Option [B]]扁平化到列表[B]

猫是否能提供类似于

implicit class FlattenListOfEither[L, R](l: List[Either[L, R]]) {
  def flattenM: List[R] = l collect { case Right(v) => v }
}
Run Code Online (Sandbox Code Playgroud)

这样

val l1: List[Either[String, Int]] = List(Right(1), Right(2), Left("error"), Right(4))
l1.flattenM
Run Code Online (Sandbox Code Playgroud)

输出

List(1, 2, 4)
Run Code Online (Sandbox Code Playgroud)

类似于Vanilla Scala展平选项列表的方式

val l2: List[Option[Int]] = List(Some(1), Some(2), None, Some(4))
l2.flatten
Run Code Online (Sandbox Code Playgroud)

哪个输出

List(1, 2, 4)
Run Code Online (Sandbox Code Playgroud)

separate 提供以下语法

import cats.implicits._
val (_, rights) = l1.separate
rights
Run Code Online (Sandbox Code Playgroud)

哪个输出

List(1, 2, 4)
Run Code Online (Sandbox Code Playgroud)

但是,是否存在flatten类似开箱即用的扩展方法,该方法仅返回权限而不是元组?

scala flatten either scala-cats

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

如何将F [_]强制为Monad的实例

我有以下类定义:

final case class Creator[F[_]](topic: String, discovery: ServiceDiscovery[F])
                                     (implicit sync: Sync[F]) {
  import JsonDeserializer._

  private def setting: ConsumerSettings[F, String, JsonDecoder] =
     discovery
       .kafkaAddr
Run Code Online (Sandbox Code Playgroud)

我想强制F[_]成为的实例Monad,可以这样使用flatMap

 private def setting: ConsumerSettings[F, String, JsonDecoder] =
     discovery
       .kafkaAddr
       .flatMap.......
Run Code Online (Sandbox Code Playgroud)

如何存档?

functional-programming scala scala-cats

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