سؤال

أنا تكافح لفهم ما يعنيه بدقة عند وجود قيمة A @cpsParam[B,C] وأي نوع من هذا النموذج يجب أن أخصص لقيمي عند استخدام مرفق المستمرات المحددة.

لقد نظرت إلى بعض المصادر:

http://lamp.epfl.ch/~rompf/continuations-icfp09.pdf.

http://www.scala-lang.org/node/2096.

http://dcsobral.blogspot.com/2009/07/delimited-continuations-explains-in.html.

http://blog.richdougherty.com/2009/02/Delimited-continuations-in-scala_24.html.

لكنهم لم يعطوني الكثير من الحدس في هذا. في الرابط الأخير، يحاول المؤلف إعطاء شرح صريح، لكنه ليس واضحا بما فيه الكفاية على أي حال.

يمثل هنا إخراج الحساب، وهو أيضا مدخلات لاستمراره. يمثل B نوع الإرجاع هذا الاستمرار، ويمثل C "النهائي" لنوع الرسل - لأن التحول يمكن أن يؤدي المزيد من المعالجة إلى القيمة التي تم إرجاعها وتغيير نوعها.

لا أفهم الفرق بين "إخراج الحساب"، "إرجاع نوع الاستمرار" و "نوع المرسل النهائي للاستمرار". أنها تبدو وكأنها المرادفات.

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

المحلول

لذلك، ساعدني الناس في هذا واحد في مكان آخر. هنا هو الجواب:

reset ({
    ...
    ...shift((k:A=>B) => ...::C)::A...
    ...
}::B)::C

وبالتالي، shift هو ثقب من النوع A في حساب {...} من النوع B. وبعد حجة shift إرجاع قيمة النوع C وهذا هو السبب reset ({...}) لديه نوع C.

الخدعة الرئيسية في فهم هذه الأشياء كانت لرؤية ذلك {...} و reset {...} لديك نوع مختلف اعتمادا على ما نوع shiftعائدات حجة.

علي سبيل المثال:

reset ({
    "number "+shift((k:Int=>String) => List(k(1), k(2), k(3)))
})

عائدات List("number 1", "number 2", "number 3").

هنا A يكون Int, B يكون String, C يكون List[String] لأن {"number" + _} هو (هنا) وظيفة من Int ل String والحجة من shift, ، بالنظر إلى تلك الوظيفة، تنتج List[String], ، والتي تصبح نتيجة reset({...}).

نصائح أخرى

ما زلت في عملية معرفة قواعد / آثار الكتابة الدقيقة المتضمنة هنا.

يبدو من السهل / أسهل إذا كانت الأنواع في الأمثلة "بسيطة بما فيه الكفاية" إلى "تنسجم جيدا" كما هو موضح أعلاه، ولكن يصبح أكثر إفائلا / صعبا (على الأقل بالنسبة لي) في مقارنة الأشياء التي تقدمها Tiark Rompf:

|- e: A@cpsParam[B,C]; {[|r|]}: U
-----------------------------------------------------
[|val x: A = e; r|] = [|e|].map( (x: A) => {[|r|]} )

لذلك نتيجة [|e|].map( (x: A) => {[|r|]} ) سيكون لديك النوع Shift[U,B,C] وفقا لتعريف الخريطة المقدمة في ورقة تيارك.

أنت هنا ليس بالضرورة هو نفسه ب.

حتى الآن أنا لا أفهم لماذا يسمح لك أن تختلف عن B دون شيء مثلU <: B تعطى في تعريف الخريطة في ورقة تيارك.

ما أنا أفتقد عدم الفشل في فهم هنا؟

أي نصائح / الأفكار؟

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