假设我有以下设置:
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......
结合Either和EitherT理解的正确方法是什么?
我想知道 IO Monad 和 Reader monad 之间有什么关系吗?
Reader monad 中的环境可以产生效果吗?如果是这样,ZIO 或 Cats IO、scalaz-effects 如何处理 Reader Monad 原则?
我花了一段时间在Google上搜索了非猫三重等于方法,但除了Scalaz找不到任何东西。不幸的是,我无法===在此库中计算出导入。
有人可以帮忙,非常感谢。
我是猫和函数式编程的新手,我正在努力进行单元测试函数数据类型,如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) 假设谓词是一个函数 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
我有以下代码片段,我想改进:
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 中的常规 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)whena和b都是两个Right值。此外,与该Future.zip函数一样,两个 future 应该并行运行:
我对函数式编程很陌生。但是,我阅读了有关 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。
在阅读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) 我有一个像这样的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属性下?
scala-cats ×10
scala ×9
cats-effect ×2
scalaz ×2
circe ×1
equals ×1
free-monad ×1
functor ×1
json ×1
specs2 ×1
zio ×1