Контекстные классы типов
Я работаю над некоторым приложением, которое работает с файлами на жестком диске. У меня есть следующая "сущность":
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 ответ
Я считаю, что контрольная сумма [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