特征中的类型参数以在 Scala 中定义数据类型 [英] type parameter in traits to define data types in scala

查看:31
本文介绍了特征中的类型参数以在 Scala 中定义数据类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 Scala 的新手,想为消息创建一个模型类.消息由标记作为键和值组成,值可以是具有指定长度、整数或枚举的字符串

I am new to scala and want to create a model class for a message .Message are comprisedoing of tag as key with value and value can be a string with specified length,int or a enumeration

tag     value
100      a    
200      b      constraint of length =45
300      0,1,2

其中 0-新1 次修正2-取消

where 0-new 1-amend 2- cancel

 trait ElementType  {
    type A
    type length
}


    case class Tag() extends ElementType {
      override type A = this.type

     }

  case class Value() extends ElementType{
     override type A = this.type
     override type length = this.type
    }

case class Message(
     messageId:MessageId
  )

case class MessageId(tag: Tag[Int], value: Value[String]){
  override def toString = tag + "=" + value + 1.toChar
 }

我在 MessageId 中遇到编译错误,有没有更好的方法来编写代码

I am getting compile error in MessageId,is there a better way to write the code

推荐答案

我猜你的 MessageId 问题是它引用了 Tag[Int]Value[String],没有泛型参数.

I guess your problem with MessageId that it refers to a Tag[Int] and Value[String], which have no generic parameters.

尝试这样的事情,但我认为您也需要重新定义 TagValue 类:

Try something like this, though I think you will need to redefine the Tag and Value classes too:

case class MessageId(tag: Tag{type A = Int}, value: Value{type A = String}){
  override def toString = tag + "=" + value + 1.toChar
}

因为您似乎想将它们用作泛型,所以我会尝试这样的操作:

As you seem to want to use them as generics, I would try something like this:

sealed trait ElementType[+A] {
    def length: Int
}

sealed trait Tag extends ElementType[Int] {
    override def length: Int = 0
}
case object Tag100 extends Tag
case object Tag200 extends Tag
case object Tag300 extends Tag

sealed trait Value[+A] extends ElementType[A] {
    override def length: Int = 0
}

final case class Value100(a: String) extends Value[String] {
    override def length: Int = a.length
}
final case class Value200(b: String) extends Value[String] {
    require(b.length <= length)
    override def length: Int = 45
}
case object Value300One extends Value[Nothing]
case object Value300Two extends Value[Nothing]
case object Value300Three extends Value[Nothing]

case class Message(
    messageId:MessageId
)

case class MessageId(tag: Tag, value: Value[String]){
    override def toString = tag + "=" + value + 1.toChar
}

+ in [+A] 表示类型是协变的,所以如果 QR 的子类型code>, ElementType[Q]ElementType[R] 的子类型.(这是Tag 与任何ElementType 兼容所必需的(因此它扩展了极端的ElementType[Nothing]).)

+ in [+A] means the type will be covariant, so if Q is a subtype of R, ElementType[Q] is a subtype of ElementType[R]. (This is necessary for Tag to be compatible with any ElementType (so it extends the extreme ElementType[Nothing]).)

您的 length 用例我不清楚.如果您希望它成为编译时约束,请查看 Shapeless' 大小使用示例.

Your use case for length is not clear for me. If you want it to be a compiletime constraint, take alook at Shapeless' Sized and an example on its usage.

这篇关于特征中的类型参数以在 Scala 中定义数据类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆