在本主题的序列中,我正在开发一个允许将块组合到 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
并询问input
inputList 中的情况。