[function] ما هو "رفع" في سكالا؟


Answers

استخدام آخر للرفع الذي صادفته في الصحف (وليس بالضرورة تلك المتعلقة بالسكالاه) هو زيادة حمولة دالة من f: A -> B مع f: List[A] -> List[B] (أو مجموعات ، multisets ، ...). وغالبًا ما يستخدم هذا لتبسيط الشكليات لأنه لا يهم إذا ما كان يتم تطبيق f على عنصر فردي أو على عناصر متعددة.

هذا النوع من الحمولة الزائدة يتم في كثير من الأحيان التصريح ، على سبيل المثال ،

f: List[A] -> List[B]
f(xs) = f(xs(1)), f(xs(2)), ..., f(xs(n))

أو

f: Set[A] -> Set[B]
f(xs) = \bigcup_{i = 1}^n f(xs(i))

أو حتمًا ، على سبيل المثال ،

f: List[A] -> List[B]
f(xs) = xs map f
Question

أحيانًا عندما أقرأ مقالات في نظام سكالا ، قرأت عبارة "رفع" أو "رفعت". لسوء الحظ ، لم يتم شرح ما يعنيه هذا بالضبط. قمت ببعض الأبحاث ، ويبدو أن الرفع له علاقة بالقيم الوظيفية أو شيء من هذا القبيل ، لكنني لم أتمكن من العثور على نص يشرح ما هو الرفع في الواقع بطريقة مبتدئة ودية.

هناك المزيد من الارتباك من خلال إطار Lift الذي رفع اسمه ، لكنه لا يساعد في الإجابة على السؤال.

ما هو "رفع" في سكالا؟




هناك أيضا إطلاق النار ، والذي هو عملية عكسية للرفع.

إذا تم تعريف الرفع ك

تحويل وظيفة جزئية PartialFunction[A, B] إلى دالة إجمالية A => Option[B]

ثم تخليص هو

تحويل دالة إجمالية A => Option[B] إلى وظيفة جزئية وظيفة جزئية PartialFunction[A, B]

تحدد مكتبة Scala القياسية Function.unlift كـ

def unlift[T, R](f: (T) ⇒ Option[R]): PartialFunction[T, R]

على سبيل المثال ، توفر مكتبة play-json unlift للمساعدة في إنشاء unlift JSON التسلسلية :

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class Location(lat: Double, long: Double)

implicit val locationWrites: Writes[Location] = (
  (JsPath \ "lat").write[Double] and
  (JsPath \ "long").write[Double]
)(unlift(Location.unapply))



Related