سؤال

إذا كان لدي وظيفة:

f : A => B => C

يمكنني تحديد تحويل ضمني بحيث يمكن استخدام هذا عند وظيفة (A, B) => C متوقع. هذا ينطبق في الاتجاه الآخر أيضا.

لماذا هذه التحويلات ليست ضمني (أو متاح ضمنيًا)؟ أنا أفترض ذلك يمكن أن تحدث أشياء سيئة لبعض قيمة الأشياء السيئة. ما هي القيمة هذه؟

هل كانت مفيدة؟

المحلول

لا أعتقد أن أي شيء سيء سيحدث. التحويل لا لبس فيه تماما. أسوأ حالة ، لن تتمكن سكالا من معرفة أن التحويل الضمني ينطبق.

implicit def curryImplicitly[A,B,C](f: (A, B) => C) =
  (a: A) => (b: B) => f(a, b)
implicit def uncurryImplicitly[A,B,C](f: A => B => C) =
  (a: A, b: B) => f(a)(b)

ثم مرة أخرى ، ستكون هذه مفيدة أيضًا.

implicit def flipImplicitly[A,B,C](f: (A, B) => C) =
  (b: B, a: A) => f(a, b)
implicit def flipImplicitlyCurried[A,B,C](f: A => B => C) =
  (b: B) => (a: A) => f(a)(b)

لكن هذه ليست متعدية ، لذلك تحتاج إلى هذه:

implicit def flipAndCurry[A,B,C](f: (A, B) => C) =
  (b: B) => (a: A) => f(a, b)
implicit def flipAndUncurry[A,B,C](f: A => B => C) =
  (b: B, a: A) => f(a)(b)

ولكن الآن التحويل غامض. لذلك ليس كل الورود.

دعونا نعرف كيف يعمل في الممارسة العملية. قد تحتاج إلى معادلات للوظيفة 3 ، الوظيفة 4 ، إلخ.

نصائح أخرى

لا تريدهم متاحًا ضمنيًا افتراضيًا (دائمًا ما يكون) لأن نظام النوع يواجه مشكلة في مساعدتك عندما تكون قد تم تحميلها على حجج لمجموعة من الأنواع المماثلة:

A => B => C
D => C      // D is allowed to be a tuple (A,B)...

(A,B) => C  // If I have this, to whom should I convert?

جزء من ميزة الكتابة القوية يحذرك عندما تفعل شيئًا أحمق. محاولة بجد لجعل الأمور تعمل تقلل من الفوائد. هنا ، إذا تم إجراء التحويلات تلقائيًا ، فقد لا تتصل بالطريقة التي تقصد الاتصال بها.

إن توفيرها ضمنيًا عند الطلب أمر جيد ، لكن ليس من الصعب القيام بذلك بنفسك إذا كنت في حاجة إليها. هذا شيء أود استخدامه نادرًا ؛ لن أضعها في أفضل عشرة أشياء أو ربما حتى أفضل مئات الأشياء التي أحبها في المكتبة (جزئيًا لأنني قد أفضل التحويل التلقائي إلى tuple بدلاً من التلقائي التلقائي/التغلب).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top