Я хотел бы попробовать частичные функции с вариантом использования с глубоким сопоставлением шаблонов. Первоначально (конечно) это не работало после применения Some(Some(3)), но вместо этого казалось определенным:
def deepTest : PartialFunction [Option[Option[Int]], Int] = {
case Some(v) => v match {
case None => 3
}
case None => 1
}
и я подумал, что, отделив вложенное сопоставление с образцом, все будет проще:
def deepTestLvl1 : PartialFunction [Option[Option[Int]], Option[Int]] = {
case Some(v) => v
case None => Some(1)
}
def deepTestLvl2 : PartialFunction [Option[Int], Int] = {
case None => 3
}
но в результате получилось следующее:
scala> (deepTestLvl1 andThen deepTestLvl2) isDefinedAt(Some(Some(3)))
res24: Boolean = true
и после применения:
scala> (deepTestLvl1 andThen deepTestLvl2) (Some(Some(3)))
scala.MatchError: Some(3) (of class scala.Some)
at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:248)
at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:246)
at $anonfun$deepTestLvl2$1.applyOrElse(<console>:7)
at $anonfun$deepTestLvl2$1.applyOrElse(<console>:7)
....
at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:83)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:96)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:105)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Я что-то делаю неправильно? Разве isDefinedAt не должен вызываться дважды, когда я последовательно составлял deepTestLvl{1,2} и давал мне правильный ответ?
andThen
. - person Akos Krivachy   schedule 23.11.2013deepTest
. - person Robin Green   schedule 23.11.2013case Some(None) => 3
иcase Some(Some(v)) => v
. Это не слишком элегантно, особенно учитывая тот факт, что количество случаев может расти в геометрической прогрессии. - person Akos Krivachy   schedule 23.11.2013