هل يمكن لـ Scala توفير أمان من نوع لأطوال الصفيف؟

3

أرغب في الحصول على عمليات التحقق من وقت الترجمة التي تتوافق مع أحجام المصفوفة.

على سبيل المثال ، الرمز البريدي والتبديل هنا آمن لأن a و b لهما نفس الطول:

(a: Seq[Int]) => { val b=a.map(_+1); Seq(a,b).transpose }

في حين أن هذا غير آمن لأن الرمز سيموت في وقت التشغيل إذا كان لكل من a و b أبعاد مختلفة:

(a: Seq[Int], b: Seq[Int]) => Seq(a,b).transpose

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

لقد بحثت في Google ووجدت الكثير من المناقشات ولكن لا توجد تطبيقات فعلية.

أود أن يفشل هذا في وقت الترجمة:

Seq(Seq(1,2,3),Seq(1,2)).transpose

أود أن ينبعث تحذير المترجم من أن هذا سيفشل إذا لم يكن البعد [2]:

(a: Seq[Int]) => Seq(a, Seq(1,2)).transpose

أريد هذا (أو شيء مشابه) لعدم إصدار تحذيرات المترجم:

(a: Seq[Int]) => a.length match {
case 2 => Seq(a, Seq(1,2)).transpose
case _ => throw new Exception(s"a has the wrong dimension")
}

1 إجابة

1
افضل جواب

لا تحتوي مكتبة scala القياسية على أي شيء من هذا القبيل ، ومن الصعب جدًا القيام بذلك بنفسك ، ولكن يمكنك استخدام Shapeless الذي يقوم بذلك بشكل أساسي (مع الكثير من التحذيرات).

:مؤلف
فوق
قائمة طعام