سؤال

وأنا جديدة على سكالا، بدأت للتو تعلم، لذلك هذا هو السؤال مبتدئين الأساسي.

وأنا أحاول أن تنفيذ المنخل من إراتوستينس خوارزمية . هنا هو ما حصلت عليه حتى الآن:

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top