1

本主题的序列中,我正在开发一个允许将块组合到 scala 的系统,因此我可以使用模式匹配来创建重写规则系统。

但是我被卡住了。

我有这个课程:

abstract class Block(n: String, in: List[Input], out: List[Out]){
  def name = n; def outputs = out; def inputs = in
}
case class GroupBlock(n: String, blocks: List[Block], in: List[Input], 
                      out: List[Out]) extends Block(n, in, out)
case class StandardBlock(n: String, in: List[Input], out: List[Out])
           extends Block(n, in, out)

abstract class Point(n: String){ def name = n }
case class Input(n:String) extends Point(n)

abstract class Out(n: String) extends Point(n)
case class Output(n:String) extends Out(n) 
case class Connection(connectedInput: Input, n: String) extends Out(n)

现在想象一下,我有这个没有显示的例子:

在此处输入图像描述

映射到这个:

val inputA = Input("sumA")
val inputB = Input("sumB")
val outputB = Output("B")

val sumAB =
    GroupBlock("GroupedSum",
      StandardBlock("Sum", List(inputA, inputB), List(outputB)) :: 
      StandardBlock("Input Provider", null, Connection(inputA, "A")::Nil ) ::
      StandardBlock("Input Provider", null, Connection(inputB, "B")::Nil ) ::         
      Nil, 
      null, 
      List(outputB))

所以...我想说:如果情况2"Integer providers""Sum"那么...

我设法通过模式匹配识别出“输入提供者”是否存在:

sumAB match{
    case GroupBlock(_, 
          StandardBlock("Input Provider", null, _ :: Connection(input, _) :: _ ) :: _,
           _, _)
        => ...
    case GroupBlock(_,
          StandardBlock("Input Provider", null, Connection(input, _) :: _ ) :: _, 
          _, _)
        => ...
    //Covering 2 more cases where the order on the list matters
}

我怎么能说“给我找一个StandardBlock名字"Input Provider"在列表中的案例”?因为这是我的主要问题之一。我需要指定所有可能的组合......现在我想做类似的事情

case GroupBlock(_,
          StandardBlock("Input Provider", null, Connection(input, _) ::
          StandardBlock("Sum", inputList, _  ) :: _, 
          _, _)

但这意味着“给我找一个案例,其中“输入提供者”位于列表的开头,而 Sum 块位于该“Sum”之后”。我想要:“给我找一个案例,其中存在一个“输入提供者”与“总和”在同一个列表中。

列表中的这种“查询”对于检查输入提供程序是否与找到的 Sum 块连接也很有用。我可以使用该变量input并询问inputinputList 中的情况。

4

1 回答 1

3

您可以在匹配子句中使用守卫来提供帮助。他们是这样的:

case 模式 if 守卫 =>

其中,guard 是一个表达式,它可以利用已绑定在模式中的变量。所以我认为这可能会做你想要的:

sumAB match {
  case GroupBlock(groupBlockName, blocks, _, _) if blocks.exists {
    case StandardBlock("Input Provider", _, inputProv_out) => blocks.exists { 
      case StandardBlock("Sum", sum_in, _) =>
        sum_in.exists { input =>
          inputProv_out.collect{ case Connection(connectedInput,_) =>
            connectedInput}.contains(input)
        }
      case _ =>
        false 
    }
    case _ => false
  } =>
    println("found")
  case _ =>
    println("no match")
}

这是一种尝试,因为翻译您正在编写的内容找到一个组块,其中存在一个输入提供程序,其中一个inputProv_out输出连接到一个总和sum_in输入

话虽如此,如果我没有犯错误,我会感到惊讶。这表明您的数据结构可能不是您想要做的最好的。或者您可能需要帮助函数来表达某些属性。

于 2012-04-12T05:00:34.770 回答