Re: Filter on future doesn't make sense
Viktor Klang <[email protected]> Fri, 1 Jul 2016 19:52:30 +0200
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <CANPzfU9H=pDVdkc20jrkZf83EeBGzP+SX4UwBT-mmy4p-Eu3Kw@mail.gmail.com> |
--001a113d01148a60dd053696a6c1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Avi, I'm unsure "seems odd" can be discussed successfully, I'm afraid. As have been demonstrated, filter on Future behaves semantically equivalent to the methods used by for-comprehensions (map, flatMap, filter/withFilter and foreach) --=20 Cheers, =E2=88=9A On Jul 1, 2016 4:17 PM, "Avi Levi" <[email protected]> wrote: > Hi Ronald , > taking the example above > scala>val x =3D Future{1}.filter(_ =3D=3D 0) > scala>x.value > res2: Option[scala.util.Try[Int]] =3D > Some(Failure(java.util.NoSuchElementException: Future.filter predicate is > not satisfied)) > > It seems odd that a legit action such as filter yields a failure with an > exception . > > Cheers > Avi > > > 2016-07-01 17:02 GMT+03:00 Roland Kuhn <[email protected]>: > >> Well =E2=80=A6 technically (and no, this is NOT a good idea, and hence i= t looks a >> little odd): >> >> scala> import concurrent._ >> import concurrent._ >> >> scala> import ExecutionContext.Implicits._ >> import ExecutionContext.Implicits._ >> >> scala> import duration._ >> import duration._ >> >> scala> Future(42) >> res0: scala.concurrent.Future[Int] =3D >> scala.concurrent.impl.Promise$DefaultPromise@25bbf683 >> >> scala> Await.ready(res0, 1.second).value.get.toOption >> res1: Option[Int] =3D Some(42) >> >> scala> Await.ready(res0.filter(_ =3D=3D 1), 1.second).value.get.toOption >> res2: Option[Int] =3D None >> >> Regards, >> >> Roland >> >> 1 juli 2016 kl. 15:18 skrev Oliver Ruebenacker <[email protected]>: >> >> >> Hello Roland, >> >> Option has get, getOrElse and the possibility to match against >> Some(value), but Future does not have these. >> >> Best, Oliver >> >> On Fri, Jul 1, 2016 at 9:06 AM, Roland Kuhn <[email protected]> wrote: >> >>> The difference is that Option does not have onComplete: if you restrict >>> yourself to the Option API then Future behaves observably in the same w= ay. >>> If you want to have something like onComplete you should look at Either= [NoSuchElementException, >>> T]#fold. >>> >>> In general there is no .filter on monads because that would require the >>> explicit ability to represent emptiness (which is not part of the >>> contract); the success path for the combinators could be seen as such a >>> representation and it is indeed often used as such, so Future is quite >>> well-behaved in this regard. Another comment I=E2=80=99d like to make o= n the >>> discussed change is that it is not reasonable to expect that the result= of >>> filtering returns a different type than the original one=E2=80=94no oth= er container >>> has this behavior. >>> >>> Regards, >>> >>> Roland >>> >>> >>> 1 juli 2016 kl. 14:54 skrev Oliver Ruebenacker <[email protected]>: >>> >>> >>> Hello, >>> >>> Looks like sometimes you do get an exception: >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> *Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java >>> 1.8.0_45).Type in expressions for evaluation. Or try :help.scala> impor= t >>> scala.concurrent.Futureimport scala.concurrent.Futurescala> import >>> scala.concurrent.ExecutionContext.Implicits.globalimport >>> scala.concurrent.ExecutionContext.Implicits.globalscala> >>> Future{1}.onComplete { case _ =3D> println("Complete!") }scala> >>> Complete!scala> Future{1}.filter(_ =3D=3D 0).onComplete { case _ =3D> >>> println("Complete!") }Complete!scala> import scala.util.{Success, Failu= re >>> }import scala.util.{Success, Failure}scala> Future{1}.filter(_ =3D=3D >>> 0).onComplete { | case Success(value) =3D> println(value) | cas= e >>> Failure(ex) =3D> println(ex) | }java.util.NoSuchElementException: >>> Future.filter predicate is not satisfiedscala>* >>> >>> Best, Oliver >>> >>> >>> On Fri, Jul 1, 2016 at 5:44 AM, Viktor Klang <[email protected]> >>> wrote: >>> >>>> I think you are conflating the notion of optionality here. >>>> >>>> option.filter(p).map(f).foreach(println) >>>> >>>> behaves exactly like >>>> >>>> future.filter(p).map(f).foreach(println) >>>> >>>> -- >>>> Cheers, >>>> =E2=88=9A >>>> On Jul 1, 2016 11:36 AM, "Avi Levi" <[email protected]> wrote: >>>> >>>>> Correct, just on future you get an exception if element does not pass >>>>> the filter. Wouldn't it be better if we can get something that expres= s an >>>>> empty future? >>>>> On Jul 1, 2016 12:30 PM, "Viktor Klang" <[email protected]> >>>>> wrote: >>>>> >>>>>> But you don't get an exception on the success path. All operations o= n >>>>>> the success path will be skipped, just as for Option. >>>>>> >>>>>> -- >>>>>> Cheers, >>>>>> =E2=88=9A >>>>>> On Jul 1, 2016 10:35 AM, "Avi Levi" <[email protected]> wrote: >>>>>> >>>>>>> Hi Victor , >>>>>>> I totally agree that expectations are subjective . >>>>>>> But like you said a filter on List will return a List if no element >>>>>>> comply than we will get Nil which represents an empty container (em= pty list) >>>>>>> a filter on option will return a option if the element doesn't >>>>>>> comply than we will get None which represents an empty container >>>>>>> following the same logic a filter on future should return something >>>>>>> that express empty container , defiantly not an exception, because = it is >>>>>>> not an exception we do intend to filter those elements. >>>>>>> >>>>>>> >>>>>>> >>>>>>> 2016-07-01 10:50 GMT+03:00 Viktor Klang <[email protected]>: >>>>>>> >>>>>>>> Hi Avi, >>>>>>>> >>>>>>>> I see what you mean. >>>>>>>> >>>>>>>> I'd want to avoid discussing expectation since it is subjective. I >>>>>>>> will however note that the actualnsemantics of the filter method o= n Future >>>>>>>> needs improvement: >>>>>>>> http://www.scala-lang.org/api/2.11.8/index.html#scala.concurrent.F= uture@filter(p:T=3D >>>>>>>> >Boolean)(implicitexecutor:scala.concurrent.ExecutionContext):scal= a.concurrent.Future[T] >>>>>>>> >>>>>>>> As for might not return the value, the same goes for all >>>>>>>> filter-methods: >>>>>>>> >>>>>>>> List returns List, but it might not have any elements at all. >>>>>>>> Option returns Option but can be Some or None, Future is either Su= ccess or >>>>>>>> Failure. >>>>>>>> >>>>>>>> If success has an optionality aspect in your usage, use Future of >>>>>>>> Option to express that, that would be my recommendation. >>>>>>>> >>>>>>>> -- >>>>>>>> Cheers, >>>>>>>> =E2=88=9A >>>>>>>> On Jul 1, 2016 9:20 AM, "Avi Levi" <[email protected]> wrote: >>>>>>>> >>>>>>>>> Thanks Victor, >>>>>>>>> Of course it can be implemented as you suggested. But still I can >>>>>>>>> argue that the current implementation is not "really filtering" t= he results >>>>>>>>> as one might expect and less expressive if it might or not return= the value >>>>>>>>> than Option is more expressive, don't you agree? >>>>>>>>> On Jul 1, 2016 10:06 AM, "Viktor Klang" <[email protected]> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Hi Avi, >>>>>>>>>> >>>>>>>>>> Use Fututre[Option[Int]] if you want to deal with Some/None as a >>>>>>>>>> result of filter ( f.map(_.filter(p) ) (alt. see monad transform= ers) >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Cheers, >>>>>>>>>> =E2=88=9A >>>>>>>>>> On Jul 1, 2016 8:53 AM, "Avi Levi" <[email protected]> wrote: >>>>>>>>>> >>>>>>>>>> I was trying to figure out what should I accept when filtering >>>>>>>>>> over a future . >>>>>>>>>> the current implementation yields either a T or an exception >>>>>>>>>> which kind of breaks referential transparency (doesn't it ?) . >>>>>>>>>> on the other hand what can I expect given this expression >>>>>>>>>> >>>>>>>>>> *def foo(i:Int):Future[Int]* >>>>>>>>>> >>>>>>>>>> the type result of >>>>>>>>>> >>>>>>>>>> *foo(1).filter(_ % 2 =3D=3D 0)* >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> I.M.H.O I would expect it to yield Option[T] which makes more >>>>>>>>>> sense to express that we might get a value that pass the filter = or not . is >>>>>>>>>> that make sense ? >>>>>>>>>> >>>>>>>>>> Cheers >>>>>>>>>> Avi >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> You received this message because you are subscribed to the >>>>>>>>>> Google Groups "scala-language" group. >>>>>>>>>> To unsubscribe from this group and stop receiving emails from it= , >>>>>>>>>> send an email to [email protected]. >>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> You received this message because you are subscribed to a topic >>>>>>>>>> in the Google Groups "scala-language" group. >>>>>>>>>> To unsubscribe from this topic, visit >>>>>>>>>> https://groups.google.com/d/topic/scala-language/wpGOB8f7qmY/uns= ubscribe >>>>>>>>>> . >>>>>>>>>> To unsubscribe from this group and all its topics, send an email >>>>>>>>>> to [email protected]. >>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to the Googl= e >>>>>>>>> Groups "scala-language" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to [email protected]. >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to a topic in >>>>>>>> the Google Groups "scala-language" group. >>>>>>>> To unsubscribe from this topic, visit >>>>>>>> https://groups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsub= scribe >>>>>>>> . >>>>>>>> To unsubscribe from this group and all its topics, send an email t= o >>>>>>>> [email protected]. >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Sincerely, >>>>>>> Avi Levi >>>>>>> m: +972-52-3459959 >>>>>>> <https://www.linkedin.com/in/leviavi> >>>>>>> https://about.me/avi.levi >>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "scala-language" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to [email protected]. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to a topic in >>>>>> the Google Groups "scala-language" group. >>>>>> To unsubscribe from this topic, visit >>>>>> https://groups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubsc= ribe >>>>>> . >>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>> [email protected]. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "scala-language" group. >>>>> To unsubscribe from this group and stop receiving emails from it, sen= d >>>>> an email to [email protected]. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "scala-language" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >>> >>> -- >>> Oliver Ruebenacker >>> Senior Software Engineer, Diabetes Portal >>> <http://www.type2diabetesgenetics.org/>, Broad Institute >>> <http://www.broadinstitute.org/> >>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "scala-language" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >>> >>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "scala-language" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> >> >> -- >> Oliver Ruebenacker >> Senior Software Engineer, Diabetes Portal >> <http://www.type2diabetesgenetics.org/>, Broad Institute >> <http://www.broadinstitute.org/> >> >> >> -- >> You received this message because you are subscribed to the Google Group= s >> "scala-language" group. >> To unsubscribe from this group and stop receiving emails from it, send a= n >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> >> >> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "scala-language" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe= . >> To unsubscribe from this group and all its topics, send an email to >> [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > Sincerely, > Avi Levi > m: +972-52-3459959 > <https://www.linkedin.com/in/leviavi> > https://about.me/avi.levi > > -- > You received this message because you are subscribed to the Google Groups > "scala-language" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > --=20 You received this message because you are subscribed to the Google Groups "= scala-language" group. To unsubscribe from this group and stop receiving emails from it, send an e= mail to [email protected]. For more options, visit https://groups.google.com/d/optout. --001a113d01148a60dd053696a6c1 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <p dir=3D"ltr">Hi Avi,</p> <p dir=3D"ltr">I'm unsure "seems odd" can be discussed succes= sfully, I'm afraid.</p> <p dir=3D"ltr">As have been demonstrated, filter on Future behaves semantic= ally equivalent to the methods used by for-comprehensions (map, flatMap, fi= lter/withFilter and foreach)</p> <p dir=3D"ltr">-- <br> Cheers,<br> =E2=88=9A</p> <div class=3D"gmail_quote">On Jul 1, 2016 4:17 PM, "Avi Levi" <= ;<a href=3D"mailto:[email protected]">[email protected]</a>> wrote:<br typ= e=3D"attribution"><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .= 8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"rtl"><div dir= =3D"ltr">Hi Ronald ,</div><div dir=3D"ltr">taking the example above=C2=A0</= div><div dir=3D"ltr">scala>val x =3D Future{1}.filter(_ =3D=3D 0)</div><= div dir=3D"ltr"><div dir=3D"ltr">scala>x.value</div><div dir=3D"ltr">res= 2: Option[scala.util.Try[Int]] =3D Some(Failure(java.util.NoSuchElementExce= ption: Future.filter predicate is not satisfied))</div></div><div dir=3D"lt= r"><br></div><div dir=3D"ltr">It seems odd that a legit action such as filt= er yields a failure with an exception .=C2=A0<br></div><div dir=3D"ltr"><br= ></div><div dir=3D"ltr">Cheers=C2=A0</div><div dir=3D"ltr">Avi</div><div di= r=3D"ltr"><div><br></div></div></div><div class=3D"gmail_extra"><br><div cl= ass=3D"gmail_quote"><div dir=3D"ltr">2016-07-01 17:02 GMT+03:00 Roland Kuhn= <span dir=3D"ltr"><<a href=3D"mailto:[email protected]" target=3D"_blan= k">[email protected]</a>></span>:</div><blockquote class=3D"gmail_quote"= style=3D"margin:0 .8ex;border-left:1px #ccc solid;border-right:1px #ccc so= lid;padding-left:1ex;padding-right:1ex"><div style=3D"word-wrap:break-word"= >Well =E2=80=A6 technically (and no, this is NOT a good idea, and hence it = looks a little odd):<div><br></div><div><div><font face=3D"Courier">scala&g= t; import concurrent._</font></div><div><font face=3D"Courier">import concu= rrent._</font></div><div><font face=3D"Courier"><br></font></div><div><font= face=3D"Courier">scala> import ExecutionContext.Implicits._</font></div= ><div><font face=3D"Courier">import ExecutionContext.Implicits._</font></di= v><div><font face=3D"Courier"><br></font></div><div><font face=3D"Courier">= scala> import duration._</font></div><div><font face=3D"Courier">import = duration._</font></div><div><font face=3D"Courier"><br></font></div><div><f= ont face=3D"Courier">scala> Future(42)</font></div><div><font face=3D"Co= urier">res0: scala.concurrent.Future[Int] =3D scala.concurrent.impl.Promise= $DefaultPromise@25bbf683</font></div><div><font face=3D"Courier"><br></font= ></div><div><font face=3D"Courier">scala> Await.ready(res0, 1.second).va= lue.get.toOption</font></div><div><font face=3D"Courier">res1: Option[Int] = =3D Some(42)</font></div></div><div><font face=3D"Courier"><br></font></div= ><div><font face=3D"Courier"><div>scala> Await.ready(res0.filter(_ =3D= =3D 1), 1.second).value.get.toOption</div><div>res2: Option[Int] =3D None</= div></font></div><div><br></div><div>Regards,</div><div><br></div><div>Rola= nd</div><div><div><div><br><div><blockquote type=3D"cite"><div>1 juli 2016 = kl. 15:18 skrev Oliver Ruebenacker <<a href=3D"mailto:[email protected]" = target=3D"_blank">[email protected]</a>>:</div><br><div><div dir=3D"ltr">= <div><div><div><br></div>=C2=A0=C2=A0=C2=A0=C2=A0 Hello Roland,<br><br></di= v>=C2=A0 Option has get, getOrElse and the possibility to match against Som= e(value), but Future does not have these.<br><br></div>=C2=A0=C2=A0=C2=A0= =C2=A0 Best, Oliver<br></div><div class=3D"gmail_extra"><br><div class=3D"g= mail_quote">On Fri, Jul 1, 2016 at 9:06 AM, Roland Kuhn <span dir=3D"ltr">&= lt;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]= </a>></span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin= :0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style=3D"word= -wrap:break-word">The difference is that Option does not have onComplete: i= f you restrict yourself to the Option API then Future behaves observably in= the same way. If you want to have something like onComplete you should loo= k at <font face=3D"Courier">Either[NoSuchElementException, T]#fold</font>.<= div><br></div><div>In general there is no .filter on monads because that wo= uld require the explicit ability to represent emptiness (which is not part = of the contract); the success path for the combinators could be seen as suc= h a representation and it is indeed often used as such, so Future is quite = well-behaved in this regard. Another comment I=E2=80=99d like to make on th= e discussed change is that it is not reasonable to expect that the result o= f filtering returns a different type than the original one=E2=80=94no other= container has this behavior.</div><div><br></div><div>Regards,</div><div><= br></div><div>Roland<div><div><br><div><br><div><blockquote type=3D"cite"><= div>1 juli 2016 kl. 14:54 skrev Oliver Ruebenacker <<a href=3D"mailto:cu= [email protected]" target=3D"_blank">[email protected]</a>>:</div><br><div><= div dir=3D"ltr"><div><div><br></div>=C2=A0=C2=A0=C2=A0=C2=A0 Hello,<br><br>= </div>=C2=A0 Looks like sometimes you do get an exception:<br><div><div><br= ><b><span style=3D"font-family:monospace,monospace">Welcome to Scala 2.11.8= (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45).<br>Type in expressions= for evaluation. Or try :help.<br><br>scala> import scala.concurrent.Fut= ure<br>import scala.concurrent.Future<br><br>scala> import scala.concurr= ent.ExecutionContext.Implicits.global<br>import scala.concurrent.ExecutionC= ontext.Implicits.global<br><br>scala> Future{1}.onComplete { case _ =3D&= gt; println("Complete!") }<br><br>scala> Complete!<br><br><br>= scala> Future{1}.filter(_ =3D=3D 0).onComplete { case _ =3D> println(= "Complete!") }<br>Complete!<br><br>scala> import scala.util.{S= uccess, Failure }<br>import scala.util.{Success, Failure}<br><br>scala> = Future{1}.filter(_ =3D=3D 0).onComplete {<br>=C2=A0=C2=A0=C2=A0=C2=A0 | cas= e Success(value) =3D> println(value)<br>=C2=A0=C2=A0=C2=A0=C2=A0 | case = Failure(ex) =3D> println(ex)<br>=C2=A0=C2=A0=C2=A0=C2=A0 | }<br><br>java= .util.NoSuchElementException: Future.filter predicate is not satisfied<br>s= cala></span></b><br><br></div><div>=C2=A0=C2=A0=C2=A0=C2=A0 Best, Oliver= <br></div><div><br></div></div></div><div class=3D"gmail_extra"><br><div cl= ass=3D"gmail_quote">On Fri, Jul 1, 2016 at 5:44 AM, Viktor Klang <span dir= =3D"ltr"><<a href=3D"mailto:[email protected]" target=3D"_blank">vi= [email protected]</a>></span> wrote:<br><blockquote class=3D"gmail_qu= ote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex= "><p dir=3D"ltr">I think you are conflating the notion of optionality here.= </p><p dir=3D"ltr">option.filter(p).map(f).foreach(println)</p><p dir=3D"lt= r">behaves exactly like</p><p dir=3D"ltr">future.filter(p).map(f).foreach(p= rintln)</p><span><font color=3D"#888888"><p dir=3D"ltr">-- <br> Cheers,<br> =E2=88=9A</p></font></span><div><div> <div class=3D"gmail_quote">On Jul 1, 2016 11:36 AM, "Avi Levi" &l= t;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a= >> wrote:<br type=3D"attribution"><blockquote class=3D"gmail_quote" styl= e=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir= =3D"ltr">Correct, just on future you get an exception if element does not p= ass the filter. Wouldn't it be better if we can get something that expr= ess an empty future? </p> <div class=3D"gmail_quote">On Jul 1, 2016 12:30 PM, "Viktor Klang"= ; <<a href=3D"mailto:[email protected]" target=3D"_blank">viktor.kl= [email protected]</a>> wrote:<br type=3D"attribution"><blockquote class=3D"g= mail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-l= eft:1ex"><p dir=3D"ltr">But you don't get an exception on the success p= ath. All operations on the success path will be skipped, just as for Option= .</p><p dir=3D"ltr">-- <br> Cheers,<br> =E2=88=9A</p> <div class=3D"gmail_quote">On Jul 1, 2016 10:35 AM, "Avi Levi" &l= t;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a= >> wrote:<br type=3D"attribution"><blockquote class=3D"gmail_quote" styl= e=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div di= r=3D"rtl"><div dir=3D"ltr">Hi Victor ,</div><div dir=3D"ltr">I totally agre= e that expectations are subjective .</div><div dir=3D"ltr">But like you sai= d a filter on List will return a List if no element comply than we will get= Nil which represents an empty container (empty list)</div><div dir=3D"ltr"= >a filter on option will return a option if the element doesn't comply = than we will get None which represents an empty container=C2=A0</div><div d= ir=3D"ltr">following the same logic a filter on future should return someth= ing that express empty container , defiantly not an exception, because it i= s not an exception we do intend to filter those elements.</div><div dir=3D"= ltr"><br></div><div dir=3D"ltr">=C2=A0</div></div><div class=3D"gmail_extra= "><br><div class=3D"gmail_quote"><div dir=3D"ltr">2016-07-01 10:50 GMT+03:0= 0 Viktor Klang <span dir=3D"ltr"><<a href=3D"mailto:[email protected]= om" target=3D"_blank">[email protected]</a>></span>:</div><blockquo= te class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc so= lid;padding-left:1ex"><p dir=3D"ltr">Hi Avi,</p><p dir=3D"ltr">I see what y= ou mean.</p><p dir=3D"ltr">I'd want to avoid discussing expectation sin= ce it is subjective. I will however note that the actualnsemantics of the f= ilter method on Future needs improvement: <a href=3D"http://www.scala-lang.= org/api/2.11.8/index.html#scala.concurrent.Future@filter(p:T=3D" target=3D"= _blank">http://www.scala-lang.org/api/2.11.8/index.html#scala.concurrent.Fu= ture@filter(p:T=3D</a>>Boolean)(implicitexecutor:scala.concurrent.Execut= ionContext):scala.concurrent.Future[T]</p><p dir=3D"ltr">As for might not r= eturn the value, the same goes for all filter-methods:</p><p dir=3D"ltr">Li= st returns List, but it might not have any elements at all. Option returns = Option but can be Some or None, Future is either Success or Failure.</p><p = dir=3D"ltr">If success has an optionality aspect in your usage, use Future = of Option to express that, that would be my recommendation. </p><span><font= color=3D"#888888"><p dir=3D"ltr">-- <br> Cheers,<br> =E2=88=9A</p></font></span><div><div> <div class=3D"gmail_quote">On Jul 1, 2016 9:20 AM, "Avi Levi" <= ;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>= > wrote:<br type=3D"attribution"><blockquote class=3D"gmail_quote" style= =3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir= =3D"ltr">Thanks Victor,<br> Of course it can be implemented as you suggested. But still I can argue th= at the current implementation is not "really filtering" the resul= ts as one might expect and less expressive if it might or not return the va= lue than Option is more expressive, don't you agree? </p> <div class=3D"gmail_quote">On Jul 1, 2016 10:06 AM, "Viktor Klang"= ; <<a href=3D"mailto:[email protected]" target=3D"_blank">viktor.kl= [email protected]</a>> wrote:<br type=3D"attribution"><blockquote class=3D"g= mail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-l= eft:1ex"><p dir=3D"ltr">Hi Avi,</p><p dir=3D"ltr">Use Fututre[Option[Int]] = if you want to deal with Some/None as a result of filter ( f.map(_.filter(p= ) ) (alt. see monad transformers)</p><p dir=3D"ltr">-- <br> Cheers,<br> =E2=88=9A</p> <div class=3D"gmail_quote">On Jul 1, 2016 8:53 AM, "Avi Levi" <= ;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>= > wrote:<br type=3D"attribution"><blockquote style=3D"margin:0 0 0 .8ex;= border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">I was trying = to figure out what should I accept when filtering over a future .<div>the c= urrent implementation yields either a T or an exception which kind of break= s referential transparency (doesn't it ?) .</div><div>on the other hand= what can I expect given this expression=C2=A0</div><div><p><span><i>def fo= o(i:Int):Future[Int]</i></span></p><p><span>the type result of=C2=A0</span>= </p><p><i>foo(1).filter(_ % 2 =3D=3D 0)</i></p><p><span><br></span></p></di= v><div>I.M.H.O I would expect it to yield Option[T] =C2=A0which makes more = sense to express that we might get a value that pass the filter or not . is= that make sense ?</div><div><br></div><div>Cheers</div><font color=3D"#888= 888"><div>Avi=C2=A0</div></font></div><font color=3D"#888888"><div><br></di= v> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </font></blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to a topic in the Goog= le Groups "scala-language" group.<br> To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/= d/topic/scala-language/wpGOB8f7qmY/unsubscribe" target=3D"_blank">https://g= roups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe</a>.<br> To unsubscribe from this group and all its topics, send an email to <a href= =3D"mailto:[email protected]" target=3D"_blank">s= [email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to a topic in the Goog= le Groups "scala-language" group.<br> To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/= d/topic/scala-language/wpGOB8f7qmY/unsubscribe" target=3D"_blank">https://g= roups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe</a>.<br> To unsubscribe from this group and all its topics, send an email to <a href= =3D"mailto:[email protected]" target=3D"_blank">s= [email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></div></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>= <div data-smartmail=3D"gmail_signature"><div dir=3D"rtl"><div><div dir=3D"r= tl"><div><div dir=3D"rtl"><div dir=3D"ltr"><span style=3D"color:rgb(51,51,5= 1);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdana,sans-= serif;font-size:14px;line-height:21px">Sincerely,</span><br style=3D"color:= rgb(51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Ve= rdana,sans-serif;font-size:14px;line-height:21px"><span style=3D"color:rgb(= 51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdan= a,sans-serif;font-size:14px;line-height:21px">Avi Levi</span></div><div dir= =3D"ltr"><span style=3D"color:rgb(51,51,51);font-family:proxima-nova-1,prox= ima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;font-size:14px;line-height:2= 1px">m: <a href=3D"tel:%2B972-52-3459959" value=3D"+972523459959" target=3D= "_blank">+972-52-3459959</a></span><span style=3D"color:rgb(51,51,51);font-= family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;fo= nt-size:14px;line-height:21px"><br></span></div><div dir=3D"ltr"><span styl= e=3D"color:rgb(51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,H= elvetica,Verdana,sans-serif;font-size:14px;line-height:21px"><a href=3D"htt= ps://www.linkedin.com/in/leviavi" target=3D"_blank"><img src=3D"https://doc= s.google.com/uc?export=3Ddownload&id=3D0B82ayL0XJaZ5WEY0c2xWQWYxNDQ&= ;revid=3D0B82ayL0XJaZ5YklVWjUvcG9tQmNrVEFRSDhNd0lNLzUwKzlvPQ"><span></span>= <span></span></a></span></div><div dir=3D"ltr"><span style=3D"margin:0px;pa= dding:0px;border:0px;outline:0px;font-size:14px;font-family:proxima-nova-1,= proxima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;vertical-align:baseline;= color:rgb(43,130,173);line-height:21px"><a href=3D"https://about.me/avi.lev= i" target=3D"_blank">https://about.me/avi.levi</a></span><br></div></div></= div></div></div></div></div> </div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to a topic in the Goog= le Groups "scala-language" group.<br> To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/= d/topic/scala-language/wpGOB8f7qmY/unsubscribe" target=3D"_blank">https://g= roups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe</a>.<br> To unsubscribe from this group and all its topics, send an email to <a href= =3D"mailto:[email protected]" target=3D"_blank">s= [email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></div></blockquote></div><br><br clear=3D"all"><br>-- <br><div data-s= martmail=3D"gmail_signature"><div dir=3D"ltr"><div><div dir=3D"ltr"><div><d= iv dir=3D"ltr"><div><div dir=3D"ltr"><div>Oliver Ruebenacker<br></div><div>= Senior Software Engineer, <a href=3D"http://www.type2diabetesgenetics.org/"= target=3D"_blank">Diabetes Portal</a>, <a href=3D"http://www.broadinstitut= e.org/" target=3D"_blank">Broad Institute</a><br></div><br></div></div></di= v></div></div></div></div></div> </div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></blockquote></div><br></div></div></div></div></div><div><div><div><= br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></div></blockquote></div><br><br clear=3D"all"><br>-- <br><div data-s= martmail=3D"gmail_signature"><div dir=3D"ltr"><div><div dir=3D"ltr"><div><d= iv dir=3D"ltr"><div><div dir=3D"ltr"><div>Oliver Ruebenacker<br></div><div>= Senior Software Engineer, <a href=3D"http://www.type2diabetesgenetics.org/"= target=3D"_blank">Diabetes Portal</a>, <a href=3D"http://www.broadinstitut= e.org/" target=3D"_blank">Broad Institute</a><br></div><br></div></div></di= v></div></div></div></div></div> </div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></blockquote></div><br></div></div></div></div><div><div> <p></p> -- <br> You received this message because you are subscribed to a topic in the Goog= le Groups "scala-language" group.<br> To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/= d/topic/scala-language/wpGOB8f7qmY/unsubscribe" target=3D"_blank">https://g= roups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe</a>.<br> To unsubscribe from this group and all its topics, send an email to <a href= =3D"mailto:[email protected]" target=3D"_blank">s= [email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></div></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>= <div data-smartmail=3D"gmail_signature"><div dir=3D"rtl"><div><div dir=3D"r= tl"><div><div dir=3D"rtl"><div dir=3D"ltr"><span style=3D"color:rgb(51,51,5= 1);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdana,sans-= serif;font-size:14px;line-height:21px">Sincerely,</span><br style=3D"color:= rgb(51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Ve= rdana,sans-serif;font-size:14px;line-height:21px"><span style=3D"color:rgb(= 51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdan= a,sans-serif;font-size:14px;line-height:21px">Avi Levi</span></div><div dir= =3D"ltr"><span style=3D"color:rgb(51,51,51);font-family:proxima-nova-1,prox= ima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;font-size:14px;line-height:2= 1px">m: <a href=3D"tel:%2B972-52-3459959" value=3D"+972523459959" target=3D= "_blank">+972-52-3459959</a></span><span style=3D"color:rgb(51,51,51);font-= family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;fo= nt-size:14px;line-height:21px"><br></span></div><div dir=3D"ltr"><span styl= e=3D"color:rgb(51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,H= elvetica,Verdana,sans-serif;font-size:14px;line-height:21px"><a href=3D"htt= ps://www.linkedin.com/in/leviavi" target=3D"_blank"><img src=3D"https://doc= s.google.com/uc?export=3Ddownload&id=3D0B82ayL0XJaZ5WEY0c2xWQWYxNDQ&= ;revid=3D0B82ayL0XJaZ5YklVWjUvcG9tQmNrVEFRSDhNd0lNLzUwKzlvPQ"><span></span>= <span></span></a></span></div><div dir=3D"ltr"><span style=3D"margin:0px;pa= dding:0px;border:0px;outline:0px;font-size:14px;font-family:proxima-nova-1,= proxima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;vertical-align:baseline;= color:rgb(43,130,173);line-height:21px"><a href=3D"https://about.me/avi.lev= i" target=3D"_blank">https://about.me/avi.levi</a></span><br></div></div></= div></div></div></div></div> </div> <p></p> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div> <p></p> -- <br /> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br /> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]">scal= [email protected]</a>.<br /> For more options, visit <a href=3D"https://groups.google.com/d/optout">http= s://groups.google.com/d/optout</a>.<br /> --001a113d01148a60dd053696a6c1--