8

ブール関数を適用するためにアクセスしているベクトルのベクトルがあります。すなわち

Vector[Vector[T]]f(myVector(i)(j))where f is of typeの行に沿って何かを実行し T => Booleanます。

しかし、これは境界チェックを行わず、本当にエレガントなものを得ることができません。

私は使用できますapplyOrElsemyVector.applyOrElse(i, (_:Int) => Vector.empty).applyOrElse (j, (_:Int) => defaultT)

どこでf(defaultT)戻りfalse ますが、関数の代わりにデフォルトの値を設定できたらいいのにと思います。

リフトを使用して を取得できますOptionが、2 番目のレベルではうまく構成できません。 myVector.lift(i) map (_.lift(j) map f getOrElse false) getOrElse false

これは機能しますが、それでも読むのは本当に難しいです。

そして、標準の if/else ブロックがあります。

if (myVector.size <= i) false
else {
  val myVector2 = levelVector(i)
  if (myVector2.size <= j) false
  else f(myVector2(j))
}

私が達成できるよりも簡単に分解できるはずの何かのように思えます。そして、3層目を追加すると、さらに醜くなります。

他のオプションはありますか?

免責事項: これは coursera の progfun コースから改作されています

4

3 に答える 3

0

少しやり過ぎのように見えても、エレガントに見えるものを考え出しました。

(for {
   myVector2 <- myVector(i)
   t <- myVector2(j)
} yield t) map f getOrElse false

これは賢明ですか?確かに読みやすい。遅いですか?

于 2013-11-04T09:57:22.203 に答える
0

vector に名前が付けvecられ、述語に という名前が付けられていると仮定するとpred、この式は正しい値を生成します。vec.lift(p.row).fold(false)(_.lift(p.col).fold(false)(pred(_))

于 2020-08-06T20:02:41.000 に答える