Re: Filter on future doesn't make sense
Viktor Klang <[email protected]> Fri, 1 Jul 2016 15:02:12 +0200
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <CANPzfU_SdUT_aJYje+u3Dc8DrskxE7A9k1AwmVTY5OJ6fz_vOA@mail.gmail.com> |
--001a114090345a4ce505369298d3 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Oliver, Which is why I explicitly talked about the success path. As you saw, onComplete takes both path, much similar to something like toString. See my previous example for details. --=20 Cheers, =E2=88=9A On Jul 1, 2016 2:54 PM, "Oliver Ruebenacker" <[email protected]> wrote: 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> import 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, Failure }import scala.util.{Success, Failure}scala> Future{1}.filter(_ =3D=3D 0).onComplete { | case Success(value) =3D> println(value) | case 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 th= e >> filter. Wouldn't it be better if we can get something that express an em= pty >> 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 on >>> 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 (empty= 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 on F= uture >>>>> needs improvement: >>>>> http://www.scala-lang.org/api/2.11.8/index.html#scala.concurrent.Futu= re@filter(p:T=3D >>>>> >Boolean)(implicitexecutor:scala.concurrent.ExecutionContext):scala.c= oncurrent.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 Success or F= ailure. >>>>> >>>>> 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" the = results >>>>>> as one might expect and less expressive if it might or not return th= e 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 transformers= ) >>>>>>> >>>>>>> -- >>>>>>> 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 sens= e >>>>>>> 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/unsubs= cribe >>>>>>> . >>>>>>> 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, >>>>>> 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 th= e >>>>> Google Groups "scala-language" group. >>>>> To unsubscribe from this topic, visit >>>>> https://groups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscr= ibe >>>>> . >>>>> 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. >>>> >>> -- >>> 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/unsubscrib= e >>> . >>> 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 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 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 Oliver Ruebenacker Senior Software Engineer, Diabetes Portal <http://www.type2diabetesgenetics.org/>, Broad Institute <http://www.broadinstitute.org/> --=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 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. --001a114090345a4ce505369298d3 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <p dir=3D"ltr">Hi Oliver,</p> <p dir=3D"ltr">Which is why I explicitly talked about the success path.<br> As you saw, onComplete takes both path, much similar to something like toSt= ring.</p> <p dir=3D"ltr">See my previous example for details.</p> <p dir=3D"ltr">-- <br> Cheers,<br> =E2=88=9A</p> <div class=3D"gmail_quote">On Jul 1, 2016 2:54 PM, "Oliver Ruebenacker= " <<a href=3D"mailto:[email protected]">[email protected]</a>> wro= te:<br type=3D"attribution"><blockquote class=3D"quote" style=3D"margin:0 0= 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>= <div><br></div>=C2=A0=C2=A0=C2=A0=C2=A0 Hello,<br><br></div>=C2=A0 Looks li= ke sometimes you do get an exception:<br><div><div><br><b><span style=3D"fo= nt-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 t= ry :help.<br><br>scala> import scala.concurrent.Future<br>import scala.c= oncurrent.Future<br><br>scala> import scala.concurrent.ExecutionContext.= Implicits.global<br>import scala.concurrent.ExecutionContext.Implicits.glob= al<br><br>scala> Future{1}.onComplete { case _ =3D> println("Com= plete!") }<br><br>scala> Complete!<br><br><br>scala> Future{1}.f= ilter(_ =3D=3D 0).onComplete { case _ =3D> println("Complete!"= ) }<br>Complete!<br><br>scala> import scala.util.{Success, 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 | case Success(value) = =3D> println(value)<br>=C2=A0=C2=A0=C2=A0=C2=A0 | case Failure(ex) =3D&g= t; println(ex)<br>=C2=A0=C2=A0=C2=A0=C2=A0 | }<br><br>java.util.NoSuchEleme= ntException: Future.filter predicate is not satisfied<br>scala></span></= b><br><br></div><div>=C2=A0=C2=A0=C2=A0=C2=A0 Best, Oliver<br></div><div><b= r></div></div></div><div class=3D"gmail_extra"><div class=3D"elided-text"><= br><div class=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">[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"><p dir=3D"ltr">I think you are conflating the notion of optional= ity here.</p> <p dir=3D"ltr">option.filter(p).map(f).foreach(println)</p> <p dir=3D"ltr">behaves exactly like</p> <p dir=3D"ltr">future.filter(p).map(f).foreach(println)</p><span><font colo= r=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 you mean.</p> <p dir=3D"ltr">I'd want to avoid discussing expectation since it is sub= jective. I will however note that the actualnsemantics of the filter 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.Future@filter(= p:T=3D</a>>Boolean)(implicitexecutor:scala.concurrent.ExecutionContext):= scala.concurrent.Future[T]</p> <p dir=3D"ltr">As for might not return the value, the same goes for all fil= ter-methods:</p> <p dir=3D"ltr">List returns List, but it might not have any elements at all= . Option returns Option but can be Some or None, Future is either Success o= r Failure.</p> <p dir=3D"ltr">If success has an optionality aspect in your usage, use Futu= re of Option to express that, that would be my recommendation. </p><span><f= ont 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 foo(i:Int):Future[Int]</i></span></p><p><span>the type resu= lt of=C2=A0</span></p><p><i>foo(1).filter(_ % 2 =3D=3D 0)</i></p> <p><span><br></span></p></div><div>I.M.H.O I would expect it to yield Optio= n[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>Che= ers</div><font color=3D"#888888"><div>Avi=C2=A0</div></font></div><font col= or=3D"#888888"> <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> </font></blockquote></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> </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]" 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 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 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> <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]" 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><font= color=3D"#888888"><div data-smartmail=3D"gmail_signature"><div dir=3D"ltr"= ><div><div dir=3D"ltr"><div><div dir=3D"ltr"><div><div dir=3D"ltr"><div>Oli= ver Ruebenacker<br></div><div>Senior Software Engineer, <a href=3D"http://w= ww.type2diabetesgenetics.org/" target=3D"_blank">Diabetes Portal</a>, <a hr= ef=3D"http://www.broadinstitute.org/" target=3D"_blank">Broad Institute</a>= <br></div><br></div></div></div></div></div></div></div></div> </font></div><div class=3D"elided-text"> <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> </div></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 /> --001a114090345a4ce505369298d3--