我正在开发一些可以处理硬盘上文件的应用程序。我有以下“实体”:
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
。那真的是类型类吗?还是我看错了方向?
答案 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.html和https://www.atlassian.com/blog/archives/scala-types-of-a-higher-kind