【问题标题】:What is the purpose of using [T : Type] in cats? [duplicate]在猫中使用 [T : Type] 的目的是什么? [复制]
【发布时间】:2019-02-16 02:34:02
【问题描述】:

我正在学习使用 Scala 猫库。我经常看到这种类型的定义,例如

implicit def validatedApplicative[E : Semigroup]: Applicative[Validated[E, ?]] = ???
def parallelValidate[E : Semigroup, A, B, C](v1: Validated[E, A], v2: Validated[E, B])(f: (A, B) => C): Validated[E, C] = ???
def parse[A : Read](key: String): Validated[ConfigError, A] = ???
  • 谁能告诉我为什么我们在[A : ClassName] 的泛型中定义A 类型为ClassName

  • 当我们将方法定义写成

    时,我们会得到什么额外的好处

    def parse[A : Read](key: String): Validated[ConfigError, A]

    而不是

    def parse(key: String): Validated[ConfigError, Read]

    对于方法声明?

【问题讨论】:

  • 我认为您对 [T: Type] 语法的理解有误。这是一个上下文绑定。 def foo[A: Read](a: A) 等价于 def foo[A](a: A)(implicit ev: Read[A])。它的意思是“这是某个 A,它的隐式 Read[A] 实例存在于范围内的某处”
  • 感谢您澄清这个疑问。

标签: scala scala-cats


【解决方案1】:

Cats 到处都使用类型类,当您想了解更多函数式方法时,您应该研究一下。

类型类可以这样定义:

trait Read[A] {
  def read(in: A): String
}

当指定这样的类型时:[A : Read]

您要求使用的类型 A 必须在范围内具有 typeClass Read 的实现。

与要求您的类型扩展许多不同的接口相比,这使得编写通用代码变得非常简单......

我相信在猫的网站上有一些介绍类型类的博客

【讨论】:

    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2015-07-14
    • 1970-01-01
    相关资源
    最近更新 更多