كيفية تحويل x => الخيار [r] إلى partialfunction [x، r
-
19-09-2019 - |
سؤال
طالما لدينا PartialFunction[X,R]
من السهل جدا تحويله إلى وظيفة عودة Option[R]
, ، على سبيل المثال
def pfToOptf[X, R](f: PartialFunction[X,R])(x: X) =
if (f.isDefinedAt(x)) Some(f(x))
else None
ومع ذلك، ماذا لو كانت المهمة عكس ذلك: لنفترض أن لدي وظيفة f
الحصول على X
كحجة وعودة Option[R]
نتيجة ل. وأريد أن أجعل PartialFunction[X,R]
خروج منه. ما هي أفضل طريقة؟
ما جئت مع تبدو قبيحة جدا لذوقي:
def optfToPf[X,R](f: X => Option[R]) : PartialFunction[X,R] = {
object extractor {
def unapply(x: X): Option[R] = f(x)
}
{ case extractor(r) => r }
}
هل هناك بعض أفضل طريقة فاتني؟
المحلول
بدءا Scala 2.9
, Function.unlift
هل هذا بدقة هذا:
def unlift[T, R](f: (T) => Option[R]): PartialFunction[T, R]
يقوم بتشغيل وظيفة T => الخيار [R] في جزء من [ر، ص].
نصائح أخرى
وماذا عن هذا:
Welcome to Scala version 2.8.0.r19650-b20091114020153 (Java HotSpot(TM) Client VM, Java 1.6.0_17).
Type in expressions to have them evaluated.
Type :help for more information.
scala> def optfToPf[X,R](f: X => Option[R]): PartialFunction[X,R] = x => f(x) match {
| case Some(r) => r
| }
optfToPf: [X,R](f: (X) => Option[R])PartialFunction[X,R]
scala>
أفترض أنك يمكن أن يتجاوز تطبيق و ISDefinedat باليد، لكنني سأفعل ذلك بالطريقة التي تجدها قبيحة.
def optfToPf[X,R](f: X => Option[R]) = new PartialFunction[X,R] {
def apply(x: X): R = f(x).get
def isDefinedAt(x: X): Boolean = f(x) != None
}
اختبارات:
scala> val map = Map(1 -> 2)
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)
scala> map(1)
res0: Int = 2
scala> def mapOpt(key: Int) = map.get(key)
mapOpt: (key: Int)Option[Int]
scala> mapOpt(1)
res1: Option[Int] = Some(2)
scala> mapOpt(2)
res2: Option[Int] = None
scala> val mapPf = optfToPf(mapOpt _)
mapPf: java.lang.Object with PartialFunction[Int,Int] = <function1>
scala> mapPf.isDefinedAt(2)
res3: Boolean = false
scala> mapPf.isDefinedAt(1)
res4: Boolean = true
scala> mapPf(1)
res5: Int = 2
scala> mapPf(2)
java.util.NoSuchElementException: None.get
لا تنتمي إلى StackOverflow