Scala 上下文感知类型类

Scala 上下文感知类型类,scala,functional-programming,typeclass,tagless-final,Scala,Functional Programming,Typeclass,Tagless Final,我正在开发一个可以处理硬盘上文件的应用程序。我有以下“实体”: 我还有以下typeclass: trait Checksum[T]{ def checksum(t: T): Long } 所有这些都是由以下特征操作的: trait Model{ def fromFile(file: File)(implicit checksum: Checksum[File]): FileChecksum } 而且看起来很好。但我决定重构它并应用无标记final。因此,模型现在看起来像: t

我正在开发一个可以处理硬盘上文件的应用程序。我有以下“实体”:

我还有以下typeclass:

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]
}

让我困惑的问题是typeclass
特征校验和[F[\u],T]
。它现在取决于上下文
F
。那真的是打字课吗?或者我看错了方向?

我相信校验和[F[z],T]仍然是一个类型类,但它现在被一个更高级的类型(HKT)参数化,它采用一个单参数类型构造函数

因此,F将List或Option等构造函数作为参数类型。即:

def checksum(t: T): F[Long]
其返回类型为F[Long],可以实现为返回列表[Long]或选项[Long]


我希望这有帮助。另请参见:和

我相信校验和[F[_],T]仍然是一个类型类,但它现在由一个更高种类的类型(HKT)参数化,它采用一个单参数类型构造函数

因此,F将List或Option等构造函数作为参数类型。即:

def checksum(t: T): F[Long]
其返回类型为F[Long],可以实现为返回列表[Long]或选项[Long]


我希望这有帮助。另请参见:和

或者,重要的是,
Identity[Long]
(即
Long
,给定
type Identity[A]=A
)。@AlexeyRomanov我不确定的是typeclass的数学定义(如果有的话)。我们能用Category语言给它一个正式的定义吗?但是这样一个特性的问题是,我不能简单地为某些类型(比如,
文件
)提供它的实现。我需要知道上下文(在我的例子中是
IO
)。或者,重要的是,
Identity[Long]
(即
Long
,给定
type Identity[A]=A
)。@AlexeyRomanov我不确定的是typeclass的数学定义(如果有的话)。我们能用Category语言给它一个正式的定义吗?但是这样一个特性的问题是,我不能简单地为某些类型(比如,
文件
)提供它的实现。我需要了解上下文(在我的情况下,它将是
IO
)。