Re: Proposal: create an Extractor for PartialFunction
杨博 <[email protected]>
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <[email protected]> |
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.