DatoPerché non riesco a flatMap a Try?
val strings = Set("Hi", "there", "friend")
def numberOfCharsDiv2(s: String) = scala.util.Try {
if (s.length % 2 == 0) s.length/2 else throw new RuntimeException("grr")
}
Perché non posso flatMap via la Prova risultante dalla chiamata di metodo? vale a dire
strings.flatMap(numberOfCharsDiv2)
<console>:10: error: type mismatch;
found : scala.util.Try[Int]
required: scala.collection.GenTraversableOnce[?]
strings.flatMap(numberOfCharsDiv2)
o
for {
s <- strings
n <- numberOfCharsDiv2(s)
} yield n
<console>:12: error: type mismatch;
found : scala.util.Try[Int]
required: scala.collection.GenTraversableOnce[?]
n <- numberOfCharsDiv2(s)
Tuttavia se uso opzione invece di Prova non c'è nessun problema.
def numberOfCharsDiv2(s: String) = if (s.length % 2 == 0)
Some(s.length/2) else None
strings.flatMap(numberOfCharsDiv2) # => Set(1, 3)
Qual è la logica alla base del non consentire flatMap su Prova?
Con 'Option' funziona solo perché esiste una conversione implicita' Opzione [A] => Iterable [A] '. Preferirei chiedere qual è la logica alla base di questa conversione. – ghik
In modo che possiamo concepire un 'Opzione' come una lista limitata a 1 dimensione. Super pratico, no? – Synesso
Uso la conversione implicita 'Opzione [A] => Iterable [A]' sempre. Penso che sia abbastanza utile pensare a un'opzione come un contenitore 0-a-1. – acjay