سؤال
وأنا جديدة على سكالا، بدأت للتو تعلم، لذلك هذا هو السؤال مبتدئين الأساسي.
وأنا أحاول أن تنفيذ المنخل من إراتوستينس خوارزمية . هنا هو ما حصلت عليه حتى الآن:
def sieve_core(cross: Int, lst: Seq[Int]): List[Int] = { val crossed = lst.filter(_ % cross != 0) crossed match { case a :: rest => cross :: sieve_core(a, crossed) case _ => cross :: Nil } } def sieve(max: Int): List[Int] = { sieve_core(2, (2 to max)) } println(sieve(100))
والنتيجة هي:
List(2)
وبقدر ما أفهم، لا يوازيه case _ => cross :: Nil
في التكرار الأول من sieve_core
، وهو ما يعني أن crossed
ليس مثيل قائمة.
ولقد غيرت المعلمات lst
نوع لList[Int]
والآن سوف رمز لا ترجمة مع وجود خطأ:
(fragment of Problem3.scala):24: error: type mismatch; found : Range.Inclusive required: List[Int] sieve_core(2, (2 to max)) ^
ويبدو Range
ليس List
.
والسؤال: كيف يمكنني تحويل المدى في القائمة؟ أو هو بعض مشكلة أكبر مع قانون بلدي، لقد جعلت بعض افتراض سيئة في مكان ما على طول الطريق؟
وأي عن تقديره للمساعدة.
المحلول
وهناك طريقة apply
على الكائن List
رفيق الذي يأخذ مجموعة وإرجاع List
:
scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
وهناك الكثير من الطرق مصنع List
مفيدة <لأ href = "http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List$" يختلط = "noreferrer" > في وثائق جمع List
.
نصائح أخرى
لتحويل أي تسلسل s
في قائمة، واستخدام s.toList
وأنا متأكد digitalross 'هو أكثر كفاءة في هذه الحالة، على الرغم من.
و(2 to max)
ليس scala.collection .immutable.List بالفعل ولكن <لأ href = "https://www.scala-lang.org/api/2.13.0/scala/collection/immutable/Range.html" يختلط = "نوفولو noreferrer" > scala.collection.immutable.Range أو على نحو أدق مثيل scala.collection.immutable.Range.Inclusive
، كما ورد في رسالة خطأ الخاص بك. فقط في تمرير علما بأن Inclusive
وExclusive
هم أنفسهم أعضاء Range
، مع معنى إلى حد ما لصناعة السيارات التفسيرية.
والطبقة المدى لحسن الحظ توفر toList
طريقة سهلة، والتي يمكنك الاستفادة لتحويل مجموعة في قائمة ولحل المشكلة، كما في التعليمات البرمجية المتكررة التالية:
scala> val max = 10
max: Int = 10
scala> val r = (2 to max)
r: scala.collection.immutable.Range.Inclusive = Range 2 to 10
scala> val l = r.toList
l: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)