BiorącDlaczego nie mogę wypróbować FlatMap?
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")
}
Dlaczego nie mogę flatMap dala Try wynikającą z wywołania metody? tj
strings.flatMap(numberOfCharsDiv2)
<console>:10: error: type mismatch;
found : scala.util.Try[Int]
required: scala.collection.GenTraversableOnce[?]
strings.flatMap(numberOfCharsDiv2)
lub
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)
Jednak jeśli mogę użyć opcji zamiast Spróbuj to nie ma problemu.
def numberOfCharsDiv2(s: String) = if (s.length % 2 == 0)
Some(s.length/2) else None
strings.flatMap(numberOfCharsDiv2) # => Set(1, 3)
Jakie jest uzasadnienie nie pozwala na flatMap spróbować?
Z 'Option' działa tylko dlatego, że istnieje niejawna konwersja' Opcja [A] => Iterable [A] '. Wolałbym zapytać, jakie jest uzasadnienie tej konwersji. – ghik
Abyśmy mogli wyobrazić sobie "Opcję" jako listę ograniczoną do rozmiaru max 1. Super przydatny, nie? – Synesso
Używam niejawnej konwersji 'Option [A] => Iterable [A]' przez cały czas. Uważam, że warto pomyśleć o opcji jako pojemniku od 0 do 1. – acjay