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
我正在使用库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) 我正在使用 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.
我想使用该存储库中的 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) 我的应用程序有两层:域和应用程序。每层都有自己的“错误”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) 对于我的示例,我将使用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) 当我使用猫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
我正在尝试使用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) 猫是否能提供类似于
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类似开箱即用的扩展方法,该方法仅返回权限而不是元组?
我有以下类定义:
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)
如何存档?