0

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

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。那真的是一个类型类吗?还是我看错了方向?

4

1 回答 1

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 -种类

于 2018-07-14T19:00:46.967 回答