模式匹配更高种类的参数
Pattern matching higher-kinded parameter
我有一个带有 ADT 和 4 个子案例的域模型,例如
sealed trait Param
case class A(...) extends Param
case class B(...) extends Param
case class C(...) extends Param
case class D(...) extends Param
以及在此参数上参数化的各种类型,例如
case class Config[T <: Param](...)
case class Parser[T <: Param](...)
case class Price[T <: Param](...)
我希望能够对其中的每一个进行模式匹配:
val config: Config[T] = ???
//Assuming T <: Param, as defined above
config match {
case confA: Config[A] =>
case confB: Config[B] =>
case confC: Config[C] =>
case confD: Config[D] =>
}
但正如我们所知,类型擦除让这变得很痛苦...
请注意,尽管我总是需要匹配更高一等的 F[T <: Param].
有什么好的想法吗?我见过 shapeless typeable,但不确定如何在我的案例中使用它。切换到 typelevel scala(我认为它解决了类型参数匹配,哇哦)不是一个选项。
大家有什么好的想法吗? :D
编辑:
这是我尝试过但 运行 编译器问题的方法:
sealed trait Param
case class A() extends Param
case class B() extends Param
case class C() extends Param
case class D() extends Param
sealed trait ForParam[F[T <: Param], T <:Param] {
def value: F[T]
}
case class ForParamA[F[_]](value: F[A]) extends ForParam[F, A]
case class ForParamB[F[_]](value: F[B]) extends ForParam[F, B]
case class ForParamC[F[_]](value: F[C]) extends ForParam[F, C]
case class ForParamD[F[_]](value: F[D]) extends ForParam[F, D]
object ForParam {
case class Example[T <: Param](f: T => String)
val exampleFormParam: ForParam[Example, _] = ???
//The below does not compile:
// [error] constructor cannot be instantiated to expected type;
// [error] found : ForParamD[F]
// [error] required: ForParam[ForParam.Example,_] where type _
// I think I run into issue related to https://github.com/scala/scala/pull/6069
exampleFormParam match {
case ForParamA(value) =>
case ForParamB(value) =>
case ForParamC(value) =>
case ForParamD(value) =>
}
}
您在 ForParamA
等中丢失了类型参数的绑定
编译以下代码:
sealed trait Param
case class A() extends Param
case class B() extends Param
case class C() extends Param
case class D() extends Param
sealed trait ForParam[F[_ <: Param], T <: Param] {
def value: F[T]
}
case class ForParamA[F[_ <: Param]](value: F[A]) extends ForParam[F, A]
case class ForParamB[F[_ <: Param]](value: F[B]) extends ForParam[F, B]
case class ForParamC[F[_ <: Param]](value: F[C]) extends ForParam[F, C]
case class ForParamD[F[_ <: Param]](value: F[D]) extends ForParam[F, D]
object ForParam {
case class Example[T <: Param](f: T => String)
val exampleFormParam: ForParam[Example, _] = ???
exampleFormParam match {
case ForParamA(value) => ???
case ForParamB(value) => ???
case ForParamC(value) => ???
case ForParamD(value) => ???
}
}
我有一个带有 ADT 和 4 个子案例的域模型,例如
sealed trait Param
case class A(...) extends Param
case class B(...) extends Param
case class C(...) extends Param
case class D(...) extends Param
以及在此参数上参数化的各种类型,例如
case class Config[T <: Param](...)
case class Parser[T <: Param](...)
case class Price[T <: Param](...)
我希望能够对其中的每一个进行模式匹配:
val config: Config[T] = ???
//Assuming T <: Param, as defined above
config match {
case confA: Config[A] =>
case confB: Config[B] =>
case confC: Config[C] =>
case confD: Config[D] =>
}
但正如我们所知,类型擦除让这变得很痛苦...
请注意,尽管我总是需要匹配更高一等的 F[T <: Param].
有什么好的想法吗?我见过 shapeless typeable,但不确定如何在我的案例中使用它。切换到 typelevel scala(我认为它解决了类型参数匹配,哇哦)不是一个选项。
大家有什么好的想法吗? :D
编辑: 这是我尝试过但 运行 编译器问题的方法:
sealed trait Param
case class A() extends Param
case class B() extends Param
case class C() extends Param
case class D() extends Param
sealed trait ForParam[F[T <: Param], T <:Param] {
def value: F[T]
}
case class ForParamA[F[_]](value: F[A]) extends ForParam[F, A]
case class ForParamB[F[_]](value: F[B]) extends ForParam[F, B]
case class ForParamC[F[_]](value: F[C]) extends ForParam[F, C]
case class ForParamD[F[_]](value: F[D]) extends ForParam[F, D]
object ForParam {
case class Example[T <: Param](f: T => String)
val exampleFormParam: ForParam[Example, _] = ???
//The below does not compile:
// [error] constructor cannot be instantiated to expected type;
// [error] found : ForParamD[F]
// [error] required: ForParam[ForParam.Example,_] where type _
// I think I run into issue related to https://github.com/scala/scala/pull/6069
exampleFormParam match {
case ForParamA(value) =>
case ForParamB(value) =>
case ForParamC(value) =>
case ForParamD(value) =>
}
}
您在 ForParamA
等中丢失了类型参数的绑定
编译以下代码:
sealed trait Param
case class A() extends Param
case class B() extends Param
case class C() extends Param
case class D() extends Param
sealed trait ForParam[F[_ <: Param], T <: Param] {
def value: F[T]
}
case class ForParamA[F[_ <: Param]](value: F[A]) extends ForParam[F, A]
case class ForParamB[F[_ <: Param]](value: F[B]) extends ForParam[F, B]
case class ForParamC[F[_ <: Param]](value: F[C]) extends ForParam[F, C]
case class ForParamD[F[_ <: Param]](value: F[D]) extends ForParam[F, D]
object ForParam {
case class Example[T <: Param](f: T => String)
val exampleFormParam: ForParam[Example, _] = ???
exampleFormParam match {
case ForParamA(value) => ???
case ForParamB(value) => ???
case ForParamC(value) => ???
case ForParamD(value) => ???
}
}