1

このトピックのシーケンスでは、ブロックをスカラに構成できるシステムを追跡しているので、パターンマッチングを使用して書き換えルールシステムを作成できます。

しかし、私は立ち往生しています。

私はこのクラスを持っています:

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"ですか?それが私の主な問題の1つだからです。可能なすべての組み合わせを指定する必要があります...今、私は次のようなことをしたかった

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

ただし、これは「「入力プロバイダー」がリストの先頭にあり、Sumブロックがその「Sum」の後に続く場合を見つけてください」という意味です。そして、私が欲しいのは、「「合計」と同じリストに「入力プロバイダー」が存在するケースを見つけてください。

リスト内のこの種の「クエリ」は、入力プロバイダーが見つかったSumブロックに接続されているかどうかを確認するのにも役立ちます。その変数を使用して、がinputListinputにある場合を尋ねることができます。input

4

1 に答える 1

3

match 句でガードを使用すると役立ちます。彼らは次のようになります:

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")
}

これは、あなたが書いているものを翻訳して、その出力の 1 つが合計入力の 1 つに接続されている入力プロバイダーが存在するグループ ブロックを見つけるinputProv_outsum_in試みです。

そうは言っても、間違いを犯していなかったら驚くでしょう。これは、あなたのデータ構造があなたがやろうとしていることに最適ではない可能性があることを示唆しています. または、特定のプロパティを表現できるようにするためにヘルパー関数が必要な場合があります。

于 2012-04-12T05:00:34.770 に答える