سؤال

أثناء إنشاء خريطة للسلسلة إلى وظائف جزئية ، ركضت إلى سلوك غير متوقع. عندما أقوم بإنشاء وظيفة جزئية كعنصر خريطة ، فإنه يعمل بشكل جيد. عندما أقوم بتخصيص فال ، فإنه يستدعي بدلاً من ذلك. محاولة استدعاء الشيك يولد خطأ. هل هذا متوقع؟ هل أفعل شيئًا غبيًا؟ التعليق على check() لرؤية الاحتجاج. أنا أستخدم Scala 2.7.7

def PartialFunctionProblem() = {
    def dream()() = {
        println("~Dream~");
        new Exception().printStackTrace()
    }
    val map = scala.collection.mutable.HashMap[String,()=>Unit]()
    map("dream") = dream()      // partial function
    map("dream")()              // invokes as expected
    val check = dream()         // unexpected invocation
    check()                     // error: check of type Unit does not take parameters 
}
هل كانت مفيدة؟

المحلول

للراحة ، تتيح لك Scala حذف Parens فارغة عند استدعاء طريقة ، ولكنها ذكية بما يكفي لترى أن النوع المتوقع في الحالة الأولى هو ()=>Unit, ، لذلك لا يزيل كل البارنس لك ؛ بدلاً من ذلك ، يحول الطريقة إلى دالة لك.

في ال val check ومع ذلك ، يبدو الأمر وكأنه يتم تخصيص نتيجة استدعاء الوظيفة لمتغير. في الواقع ، فإن الثلاثة من هؤلاء يفعلون نفس الشيء بالضبط:

val check = dream
val check = dream()
val check = dream()()

إذا كنت تريد تحويل الطريقة إلى وظيفة ، فأنت تضع _ بعد الطريقة بدلاً من قائمة الحجج (ق). هكذا،

val check = dream() _

ستفعل ما تريد.

نصائح أخرى

حسنًا ، المشكلة هي أنك أخطأت. :-)

فيما يلي بعض الأخطاء المفاهيمية:

def dream()() = {
    println("~Dream~");
    new Exception().printStackTrace()
}

هذه ليست وظيفة جزئية. هذه طريقة مجهدة مع قوائم معلمة فارغة تعود Unit.

val map = scala.collection.mutable.HashMap[String,()=>Unit]()

نوع القيم في هذه الخريطة ليس وظيفة جزئية ، ولكن الوظيفة. خاصة، Function0[Unit]. وظيفة جزئية سيكون لها نوع PartialFunction[T, R].

map("dream") = dream()      // partial function

ما يحدث هنا هو أن سكالا المتحولون الطريقة المطبقة جزئيا في وظيفة. هذه ليست مهمة بسيطة. يقوم Scala بالتحويل لأن نوع الاستدلال يمكن أن يخمن النوع الصحيح.

val check = dream()         // unexpected invocation

هنا لا يوجد نوع متوقع لمساعدة نوع الاستدلال. ومع ذلك ، يمكن أن تكون قوائم المعلمات الفارغة ، لذلك هذا مجرد استدعاء طريقة.

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