scala - 在猫中使用 [T : Type] 的目的是什么?
问题描述
我正在学习使用 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
is 类型吗?ClassName
[A : ClassName]
当我们将方法定义编写为
def parse[A : Read](key: String): Validated[ConfigError, A]
代替
def parse(key: String): Validated[ConfigError, Read]
方法声明?
解决方案
Cats 到处都使用类型类,当你想了解更多函数式方法时,你应该研究一下。
类型类可以定义如下:
trait Read[A] {
def read(in: A): String
}
当指定这样的类型时:[A : Read]
您要求使用的类型 A 必须在范围内具有 typeClass Read 的实现。
与要求您的类型扩展许多不同的接口相比,这使得编写通用代码变得非常简单......
我相信在猫网站上有一些介绍类型类的博客
推荐阅读
- python - python等到postgres数据库中的某些东西发生变化
- flutter - 未处理的异常:MissingPluginException(未找到通道 video_thumbnail 上的方法文件的实现)
- configuration - 什么是存储设备配置信息的好机制
- qt - 如何在 ShapePath 中使用 LinearGradient?
- django - 每个用户的 Django 模型存储信息
- c# - Unity 3D射击和摧毁敌人不起作用
- batch-file - 尝试制作一个在不输入任何内容但按 Enter 时不会崩溃的菜单
- linkedin - LinkedIn:通过 URN 获取潜在客户的 API?
- java - 基于多个属性对对象进行分组
- git - 如何撤消另一个分支的 git pull 并解决合并冲突?