scala - 上下文感知类型类
问题描述
我正在开发一些适用于硬盘上文件的应用程序。我有以下“实体”:
final case class File(path: String)
final case class FileChecksum(f: File, checksum: Long)
我还有以下类型类:
trait Checksum[T]{
def checksum(t: T): Long
}
所有这些都由以下特征操作:
trait Model{
def fromFile(file: File)(implicit checksum: Checksum[File]): FileChecksum
}
而且看起来还不错。但我决定重构它并应用无标签最终。所以模型现在看起来像:
trait Model[F[_]]{
def fromFile(file: File)(implicit checksum: Checksum[F, File]): F[FileChecksum]
}
trait Checksum[F[_], T]{
def checksum(t: T): F[Long]
}
让我困惑的问题是 typeclass trait Checksum[F[_], T]
。现在取决于上下文F
。那真的是一个类型类吗?还是我看错了方向?
解决方案
我相信 Checksum[F[_], T] 仍然是一个类型类,但现在由更高种类的类型(HKT)参数化,它采用单参数类型构造函数。
因此,F 将 List 或 Option 等类型构造函数作为参数。那是:
def checksum(t: T): F[Long]
其返回类型为 F[Long],可以实现为返回 List[Long] 或 Option[Long]。
我希望这有帮助。另请参阅:https ://typelevel.org/blog/2016/08/21/hkts-moving-forward.html 和https://www.atlassian.com/blog/archives/scala-types-of-a-higher -种类
推荐阅读
- azure-web-app-service - 如何在 Azure 网站中使用 web3js 访问 Azure 私有节点?
- javascript - 用于 HTML 元素的函数中的“this”关键字
- google-apps-script - 分析工作表数据以创建值摘要
- javascript - 为什么这转向二维数组?
- javascript - 我怎样才能阅读这个 javascript 代码?
- node.js - Agenda.js 阻止 app.js 工作
- algorithm - 如何逆向工程这个方程
- c++ - 来自矩阵的奇怪符号
- vue.js - vue-resource:$http 请求的成功是如何确定的?
- c# - 如何在 .net 核心中为自动生成的构造函数注入 DelegatingHandler 数组