Re: Failure should probably extend Try[Nothing], as shown in first lecture of Principles of Reactive Programming

Viktor Klang <[email protected]>
Newsgroups gmane.comp.lang.scala
Message-ID <CANPzfU_Ai9b+_JDH-74mzCLBVND+FeTrbP+yRL9rDkJj+QpibA@mail.gmail.com>
Hi Christoph,

The only reason this hasn't been done before is due to backwards
compatibility.

-- 
Cheers,
√
On 12 May 2015 17:34, "Christoph Neijenhuis" <[email protected]>
wrote:

> In the lecture Monads (slide 22), Try with Success and Failure was
> introduced. In particular, Failure was defined as:
>
> case class Failure(ex: Exception) extends *Try[Nothing]*
>
> However, in scala.util it is actually defined this way:
>
> final case class Failure[+T](exception: Throwable) extends *Try[T]*
>
> I tried to figure out why Failure would remain a generic class while e.g.
> None doesn't, but I couldn't come up with an explanation. In fact, I'd
> argue Failure, like None, should use the bottom type for two reasons:
>
> 1. When dealing with a Failure, one doesn't have to worry about a generic
> type that doesn't make any difference anyway. E.g. when pattern matching:
>
> case None => ... // Compiles
> case Failure => ... // Does not compile: "pattern type is incompatible
> with expected type"
> case Failure[_] => ... // Compiles, but is unintuitive when working with
> None previously
>
> Or when passing a failure along, one has to cast to the "correct" generic
> type (seen in the implementation of Failure itself, but this example is
> from the implementation of Future)
>
> case f: Failure[_] => p complete f.asInstanceOf[Failure[(T, U)]]
>
> When using the bottom type, this simply becomes:
>
> case f: Failure => p complete f
>
> 2. The method signatures and the generated scaladoc are more obvious. E.g.
> the get method of None is defined as:
>
> def get: Nothing
>
> whereas the get method of Failure is:
>
> def get: T
>
> I'd argue in the case of None, it's much easier to figure out one
> shouldn't use the get method based on the signature.
>
>
> I did go forward and changed the implementation of Failure:
> https://github.com/cneijenhuis/scala/commit/e03c6bda9d6c92b764f540278d718098e7778791#diff-a2cc47b875d07181ae9e71681fb3f07dL211
> But the resulting class is obviously not compatible with the previous
> version. I fixed the resulting errors in Future and JavapClass as well -
> these changes also show nicely why I think it's benificial to use Nothing.
>
> Anyway, my questions are:
> Is there a reason I missed why Failure should really be a generic class
> and not extend Try[Nothing]?
> If not - is there any chance I can submit a pull request with this? After
> all, it's a breaking change... but I do see those are scheduled for "Aida",
> and, while Try isn't a collection, this change would fit with the theme of
> "we want to make them even easier to use" :-)
>
> Best,
> Christoph
>
> --
> 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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.