Контекстные классы типов

Я работаю над некоторым приложением, которое работает с файлами на жестком диске. У меня есть следующая "сущность":

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

Другие вопросы по тегам