EDIT: Ho appena ricordato che appiattire ha lo stesso effetto come il mio filtro e mappareScala lista condizionale costruzione
sto usando Scala 2.9.2, e vorrebbe costruire una lista in base ad alcune condizioni.
Si consideri il seguente, dove cond è una funzione di prendere un predicato p ed un valore di tipo T (in questo caso t3):
t1 :: t2 :: cond(p, t3) :: t4
Il comportamento che voglio è la seguente. Se p è vero, questo dovrebbe dare:
List[T](t1, t2, t3, t4)
Se p restituisce false, questo dovrebbe dare:
List[T](t1, t2, t4)
Probabilmente sto pensando a questo completamente il modo sbagliato, ma sto lottando per trovare una soluzione elegante. Potrei coinvolgere Opzioni dappertutto e poi filtrare, ma che lo rende il codice piuttosto difficile da leggere:
def cond[T](p : => Boolean, v : T) : Option[T] =
{
p match
{
case true => Some(v)
case false => None
}
}
In questo modo il seguente:
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)
Tuttavia, non è la soluzione più elegante, in quanto richiede l'utente per avvolgere tutti i loro elementi non condizionali in alcuni() e anche per ricordare di appiattire alla fine. Qualcuno può pensare ad una soluzione più elegante?
Questo funziona, ma non è l'ideale, in quanto non si adatta al metodo di costruzione 1 :: 2: 3: richiede di ricordare di usare ++ in alcuni casi invece di :: – paulmdavies