当前位置: 首页 > 知识库问答 >
问题:

扩展一个共同特征的不成形HList类型

西门旻
2023-03-14

我有一些基于不成形HLists的类型:

type t1 = Int :: String :: Int :: HNil
type t2 = String :: String :: Int :: HNil

我想定义一个sealed traitST,它是所有类型的超级类型,因此,如果我有以下函数:

def fun(x:ST) = …

以下内容有效:

fun(5 :: "foo" :: 3 :: HNil)       // It is a t1
fun("foo" :: "bar" :: 42 :: HNil)  // It is a t2

但以下内容不适用:

fun(5 :: 3 :: HNil)

如何将t1和t2定义为ST的子类型?

更新

我认为副产品可能是一个解决方案

type ST = t1 :+: t2 :+: CNil

fun(Coproduct[ST](5 :: "foo" :: 3 :: HNil)) // compiles
fun(Coproduct[ST](5 :: 3 :: HNil))          // does not compile

共有1个答案

陈法
2023-03-14

不可能使用别名将类型“生成”为任何内容的子类型,别名只是一个新名称。虽然可以使用副产品,但创建一个新的类型类可能更自然:

import shapeless._

type t1 = Int :: String :: Int :: HNil
type t2 = String :: String :: Int :: HNil

trait Funnable[A]

implicit object t1Funnable extends Funnable[t1]
implicit object t2Funnable extends Funnable[t2]

def fun[A: Funnable](x: A) = x

现在您要编译的行会,而您不要编译的行不会。

 类似资料:
  • 我有一个特点和扩展它的对象。 我想创建这个对象的列表并映射到上面: 以及实现Poly函数的不同尝试: 编译器告诉我: 错误:(45,43)找不到参数映射器的隐式值:无形状。ops。hlist。映射器[com.test.EncodePoly.type,com.test.A.type::com.test.B.type::com.test.C.type::shapeless.HNil]val结果:Lis

  • 我正在使用scalatest来单元测试扩展了一个trait的类(从我的类使用该trait作为mixin的意义上说)。 问题:以这种方式使用traits-as-a-mixin是否实际上阻止了使用模拟框架来模拟/存根mixin中的方法进行单元测试的能力?例如,模拟和截短框架是否依赖于依赖注入的使用? ps.我一直在使用Mockito,但我并不反对使用scalamock或任何其他框架。我之所以研究sca

  • 我用openlayers 3在地图中上传了一个geojson文件。geojson文件是一个FeatureCollection,具有LineString类型的5个功能。如何为每个功能添加不同的颜色以区分路径?如果我将颜色添加到geojson文件的样式中,则不会读取该文件,如果我将颜色添加到笔划中,则所有功能都以单一颜色着色。 下面我添加代码。 谢谢 文件GEOJSON: "type":"Featur

  • 希望有人能帮助我这个问题,因为我找到的所有答案似乎对我不起作用。 在我的myProj webapp下,我有以下内容 . 我的application-context.xml有这个(application-context.xml有名为hibernate-context和model-context.xml的子XML,但它们一直都很好)

  • 你好,有人知道如何发现扩展< code>ArrayBlockingQueue的类吗?例如,我想监视下面的< code>MyBufferQueue类 在属于java库的< code>ArrayBlockingQueue类中,有这样一个方法: 我遇到的问题是,当我监视类< code>MyBufferQueue时,以及在测试期间访问方法< code > ArrayBlockingQueue . put(

  • 我需要找到我的集合是否包含相同或超过5个元素的公共变量,并找到这些元素。我这样做: 但是你认为把另一个流放进去过滤是不好的做法。