Re: Proposal: create an Extractor for PartialFunction
Rex Kerr <[email protected]>
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <CAP_xLa2pHJgqsT0J+m8uiTQp6eYTgF3VbXab7Fjt6ZLCZxyJ2w@mail.gmail.com> |
It would be more useful with eta-conversion, I agree. --Rex On Fri, Jul 10, 2015 at 12:44 PM, 杨博 <[email protected]> wrote: > Thank you. But I think Computes for Function1 is not that useful unless we > allow eta-conversion as a pattern. e.g. > > case foo.someMethod.Computes(x) => > > > > Rex Kerr <[email protected]>于2015年7月11日周六 上午3:32写道: > >> I think it's a good idea. I'd make it more general, actually: call it >> `Computes`, and make a (lower priority) version on Function1 also. >> >> You often want to do things like >> >> foo match { >> case bar.Computes(x) if baz(x) => x >> case _ => quux >> } >> >> where the only difference with the PartialFunction is that you don't >> always need the if clause since it's embedded. >> >> It wouldn't be fast for primitives, for instance, since you always have >> the overhead of at least a virtual Some wrapper (and maybe a real one, >> depending on the JVM). But it'd sure be handy. >> >> --Rex >> >> >> >> >> On Thu, Jul 9, 2015 at 8:06 AM, 杨博 <[email protected]> wrote: >> >>> >>> https://github.com/search?q=if+catcher.isDefinedAt&ref=reposearch&type=Code&utf8=%E2%9C%93 >>> >>> There are too many people who have to use case e if >>> catcher.isDefinedAt(e) => >>> >>> Does that matter? >>> >>> 在 2015年7月9日星期四 UTC+8下午10:57:40,杨博写道: >>> >>>> lift and applyOrElse are hard to work with other cases in a match >>>> expression, especially when dealing with Exceptions. For example: >>>> https://github.com/Atry/memcontinuationed/blob/master/src/main/scala/com/dongxiguo/memcontinuationed/Memcontinuationed.scala#L599 >>>> >>>> 在 2015年7月9日星期四 UTC+8下午10:43:15,Vlad Patryshev写道: >>>>> >>>>> Here's some discussion of this issue: >>>>> http://stackoverflow.com/questions/5902266/inverse-of-partialfunctions-lift-method >>>>> >>>>> Instead of going back into the world of booleans and conditions, I'd >>>>> suggest to think about why there's no such thing already available. Maybe >>>>> this is the right direction. applyOrElse is total; if it does not >>>>> work for you, lift should. It is pretty scientific, and gets you to a >>>>> Kleisli category. All these ifs and match/cases are a little bit like >>>>> crutches. >>>>> >>>>> Thanks, >>>>> -Vlad >>>>> >>>>> On Wed, Jul 8, 2015 at 9:56 PM, 杨博 <[email protected]> wrote: >>>>> >>>>>> Sometimes, when I create a method, I need an extractor parameter for >>>>>> pattern matching, while there is not a generic extractor trait in the Scala >>>>>> Standard Library. So we have to use a PartialFunction as the >>>>>> parameter instead. >>>>>> >>>>>> >>>>>> When I use the PartialFunction, I had to create pattern matching >>>>>> expression like this. >>>>>> >>>>>> >>>>>> input match { >>>>>> >>>>>> case x if partialFunction.isDefined(x) => >>>>>> >>>>>> val data = partialFunction.apply(x) >>>>>> >>>>>> doSomethingWith(data) >>>>>> >>>>>> } >>>>>> >>>>>> >>>>>> This approach is not perfect because: >>>>>> >>>>>> >>>>>> 1. partialFunction.isDefined and partialFunction.apply checked x >>>>>> twice, which is slow if isDefined has complex logical, checking >>>>>> whether a file exists for example. >>>>>> 2. The if condition around temporary variable x is too trivial. >>>>>> >>>>>> I think the better approach is converting the PartialFunction to an >>>>>> extractor and matching with that extractor >>>>>> >>>>>> >>>>>> implicit final class PartialFunctionAsExtractor[A, B](pf: >>>>>> PartialFunction[A, B]) { >>>>>> >>>>>> object Extractor { >>>>>> >>>>>> def unapply(a: A) = PartialFunction.condOpt(a)(pf) >>>>>> >>>>>> } >>>>>> >>>>>> } >>>>>> >>>>>> >>>>>> input match { >>>>>> case partialFunction.Extractor(data) => >>>>>> doSomethingWith(data) >>>>>> } >>>>>> >>>>>> Since this is a common approach, I hope adding the >>>>>> PartialFunctionAsExtractor to scala.Predef . >>>>>> >>>>>> I would like to create a pull request if people like this idea. >>>>>> >>>>>> -- >>>>>> 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. >>> >> -- >> 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/g0-hbN5qerQ/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. >> > -- > 杨博 (Yang Bo) > > -- > 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.