上下文感知类型类

时间:2018-07-14 18:01:25

标签: scala functional-programming typeclass tagless-final

我正在开发一些可以处理硬盘上文件的应用程序。我有以下“实体”:

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]
}

让我感到困惑的问题是类型类trait Checksum[F[_], T]。现在,它取决于上下文F。那真的是类型类吗?还是我看错了方向?

1 个答案:

答案 0 :(得分:2)

我相信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.htmlhttps://www.atlassian.com/blog/archives/scala-types-of-a-higher-kind