Scala 上下文感知类型类
我正在开发一个可以处理硬盘上文件的应用程序。我有以下“实体”: 我还有以下typeclass: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
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
)。