首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式匹配与递归问题

模式匹配与递归问题
EN

Stack Overflow用户
提问于 2016-09-19 02:08:28
回答 1查看 175关注 0票数 1

下面是我的ADT。需要注意的是,块可以嵌套(查看children属性)。

代码语言:javascript
复制
trait Cda {
  def format: String = this match {
    case f: Field => f.value
    case Block(fields, children) => fields.map(f => f.format).mkString("|") + "|" + children.map(b => b.format).mkString("|")
    case Record(keys, blocks) => blocks.map(b => b.format).mkString("|")
  }
}

trait Field extends Cda {
  val name: String
  val value: String
}

case class StringField(name: String, value: String) extends Field
case class DateField(name: String, value: String) extends Field
case class TimeField(name: String, value: String) extends Field
case class MatchKey(keyFields: Seq[Field]) extends Cda
case class Block(fields: Seq[Field], children: Seq[Block] = Seq()) extends Cda
case class Record(key: MatchKey, blocks: Seq[Block]) extends Cda

下面是该ADT的示例实例化

代码语言:javascript
复制
//Block - AI
val aiBlockId = StringField("blockId", "AI")
val addlFieldPos = StringField("AdditionalFieldPosition", "addlFieldPos")
val addlFieldName = StringField("AdditionalFieldName", "addlFieldName")
val AI = Block(Seq(aiBlockId, addlFieldPos, addlFieldName))

//Block - RPS
val rpsBlockId = StringField("blockId", "RPS")
val dateOfStatus = DateField("DateOfStatus", "19240811")
val timeOfStatus = TimeField("TimeOfStatus", "023829")

val rpsBlocks = Seq(rpsBlockId, dateOfStatus, timeOfStatus)

val rpsNestedBlocks = Seq(AI)

val RPS = Block(rpsBlocks, rpsNestedBlocks)

我希望格式化来返回RPS|19240811|023829|AI|addlFieldPos|addlFieldName,但是我在末尾得到了一个额外的管道\RPS|19240811|023829|AI|addlFieldPos|addlFieldName|

如何更改递归函数format (特别是case Block(fields,children))来纠正这一点?

EN

回答 1

Stack Overflow用户

发布于 2016-09-19 02:56:10

代码语言:javascript
复制
trait Cda {
  def format: String = this match {
    case f: Field => f.value
    case Block(fields, children) => fields.map(f => f.format).mkString("|") + {if (!children.isEmpty) {"|" + children.map(b => b.format).mkString("|")} else ""}
    case Record(keys, blocks) => blocks.map(b => b.format).mkString("|")
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39564435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档