gpt4 book ai didi

scala - 对一系列类型的抽象

转载 作者:行者123 更新时间:2023-12-02 20:57:49 24 4
gpt4 key购买 nike

假设我们有一个类型T[A,B],我们可以表达以下类型约束吗,我们称之为HT:

满足 HT 的每个类型都必须采用以下形式 T[P1, P2]::T[P2, P3]::T[P3, P4]::...::T[PN-1, PN]::HNil

对于某些类型 x = P1::P2::...::PN::HNil

我正在尝试找到类型化顺序处理管道的抽象。

最佳答案

做这种事情最方便的方法通常是编写自己的类型类。这是一个快速工作草图:

import shapeless._

trait T[I, O] extends (I => O)

trait Pipeline[P <: HList] {
type In
type Out
type Values <: HList
}

object Pipeline {
type Aux[P <: HList, In0, Out0, Values0 <: HList] = Pipeline[P] {
type In = In0; type Out = Out0; type Values = Values0
}

def apply[P <: HList](
implicit pipeline: Pipeline[P]
): Aux[P, pipeline.In, pipeline.Out, pipeline.Values] = pipeline

implicit def onePipeline[I, O]: Aux[T[I, O] :: HNil, I, O, I :: O :: HNil] =
new Pipeline[T[I, O] :: HNil] {
type In = I
type Out = O
type Values = I :: O :: HNil
}

implicit def longerPipeline[I, O, P <: HList, Out0, Values0 <: HList](
implicit pipeline: Aux[P, O, Out0, Values0]
): Aux[T[I, O] :: P, I, Out0, I :: Values0] =
new Pipeline[T[I, O] :: P] {
type In = I
type Out = Out0
type Values = I :: Values0
}
}

然后(为了清晰起见,重新格式化):

scala> Pipeline[T[String, Int] :: T[Int, Char] :: HNil]
res5: Pipeline[T[String, Int] :: T[Int, Char] :: HNil] {
type In = String
type Out = Char
type Values = String :: Int :: Char :: HNil
} = Pipeline$$anon$2@38fd077c

scala> Pipeline[T[String, Int] :: T[Char, Char] :: HNil]
<console>:19: error: could not find implicit value for parameter
pipeline: Pipeline[[T[String, Int] :: T[Char, Char] :: HNil]
Pipeline[T[String, Int] :: T[Char, Char] :: HNil]
^

无效的管道无法编译,对于有效的管道,我们可以正确推断端点和中间值。

关于scala - 对一系列类型的抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26763167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com