Re: Proposal: create an Extractor for PartialFunction
Vlad Patryshev <[email protected]>
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <CAFhNTo-NG-D7pT7joM=Pi-KeC+h=g--JQx6F_x8hihuOctQhOw@mail.gmail.com> |
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.