EDIT: Właśnie pamiętać, że spłaszczyć ma taki sam efekt jak moim filtrze i mapScala lista warunkowa budowa
Używam Scala 2.9.2, i chciałby skonstruować listę opartą na pewnych warunkach.
Rozważmy następujące, gdzie cond jest jakaś funkcja robienia predykat P i wartość typu T (w tym przypadku T3):
t1 :: t2 :: cond(p, t3) :: t4
Zachowanie Chcę się następująco. Jeśli p jest prawdziwe, powinno to dać:
List[T](t1, t2, t3, t4)
jeżeli p ma wartość false, to powinien dać:
List[T](t1, t2, t4)
ja prawdopodobnie myśli o tym całkowicie niewłaściwy sposób, ale mam zmaga wymyślić eleganckie rozwiązanie. Mógłbym zaangażować Opcje wszędzie, a następnie filtrować, ale to sprawia, że kod raczej trudniejsze do odczytania:
def cond[T](p : => Boolean, v : T) : Option[T] =
{
p match
{
case true => Some(v)
case false => None
}
}
Pozwala następujące:
scala> (Some(1) :: Some(2) :: cond(true, 3) :: Some(4) :: Nil).flatten
res4: List[Int] = List(1, 2, 3, 4)
scala> (Some(1) :: Some(2) :: cond(false, 3) :: Some(4) :: Nil).flatten
res5: List[Int] = List(1, 2, 4)
Jednakże, nie jest to najbardziej eleganckie rozwiązanie, ponieważ wymaga użytkownik, aby zawinąć wszystkie ich elementy nie-warunkowe w Some(), a także pamiętać o spłaszczeniu na końcu. Czy ktoś może pomyśleć o bardziej eleganckim rozwiązaniu?
Działa, ale nie jest idealny, ponieważ nie pasuje do metody konstrukcji 1 :: 2 :: 3: wymaga zapamiętania, aby użyć ++ w niektórych przypadkach zamiast :: – paulmdavies