4

我有这段代码可以编译并且工作正常

import cats.implicits._
Cartesian[ValidResponse].product(
    getName(map).toValidated,
    readAge(map).toValidated
).map(User.tupled)

但是我不喜欢导入,cats.implicits._因为那里的类太多了。我尝试导入与笛卡尔相关的特定内容,例如

import cats.implicits.catsSyntaxCartesian
import cats.implicits.catsSyntaxUCartesian
import cats.implicits.catsSyntaxTuple2Cartesian

但这些都不起作用。作为一个新手,我发现隐式导入非常令人困惑,因为它们只有 1000 个,而且名称不是很明显。我唯一的选择是导入整个宇宙import cats.implicits._并停止思考它。

事实上,我对 和 有更广泛cats.implicitscats.instances._困惑cats.syntax._。到目前为止,我只是通过反复试验导入这些。我不确定何时导入什么。

4

2 回答 2

8

不要试图从中挑选出具体的东西cats.implicits。您要么导入整个东西,要么根本不使用它。此外,没有理由害怕全部进口。它不能干涉任何事情。

好吧,我撒谎了。如果导入cats.instances.<x>._和/或cats.syntax.<x>._cats.implicits._. 这些组是相互排斥的:您可以使用 导入所有内容并忘记它,或者使用和cats.implicits._专门选择要导入的内容。cats.instancescats.syntax

这两个包并不意味着完全像cats.implicits. 相反,它们包含 一堆对象。每个对象都包含一些隐式实例/语法,您应该从那些.

import cats.implicits._ // Good, nothing to fear
// RESET IMPORTS
import cats.implicits.catsSyntaxCartesian // Bad, don't pick and choose
// RESET IMPORTS
import cats.instances._ // Bad, is useless
import cats.syntax._    // Ditto
// RESET IMPORTS
import cats.instances.list._   // ok
import cats.syntax.cartesian._ // ok
// RESET IMPORTS
import cats.implicits._
import cats.syntax.monad._ // Bad, don't mix these two

另外每个都cats.{ instances, syntax }包含一个all对象,具有明显的功能。导入cats.implicits._确实是import cats.syntax.all._, cats.instances.all._.

于 2017-01-01T04:32:45.253 回答
2

我首先会说这import cats.implicits._是安全、合理和推荐的方法。因此,如果这个问题的唯一原因是你不喜欢导入太多的类,那么我认为你应该按原样咬住被欺负的人。

另外,我建议你看看官方的猫进口指南。它试图解释猫代码的包/逻辑结构,并可能使其更容易理解。

“猫”库被组织在几个“区域”中,可以通过它们的包名称轻松区分:

  1. cats._- 这是大多数类型类存在的地方(例如 Monad、Foldable 等)
  2. cats.data._- 这是 Validated 和 State 等数据结构的所在地。
  3. cats.instances._- 这是 1 中定义的类型类的实例所在的位置。例如,如果您导入cats.instances.list._,您会将标准列表的 Show、Monad 等实例纳入范围。这可能是您最感兴趣的内容
  4. cats.syntax._- 有一些语法丰富,使代码更容易编写和阅读。

使用的一个例子cats.syntax._是:

import cats.Applicative
import cats.syntax.applicative._

val listOfInt = 5.pure[List]
//instead of 
val otherList = Applicative[List[Int]].pure(5)
于 2017-01-01T13:31:18.593 回答