我正在开发一些可以处理硬盘上文件的应用程序。我有以下"实体":
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
}
而且它看起来很好。但我决定重构它并应用无标签的final。所以现在的模型看起来像:
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
。那真的是打字课吗?或者我看错方向了?
我相信Checksum[F[_],T]仍然是一个类型类,但它现在由一个更高级的kinded类型(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