문제

나는 Scala를 처음 접했고 방금 학습을 시작했기 때문에 이것은 기본 초보자 질문입니다.

나는 구현하려고 노력한다 에라 토스 테네스의 체 연산. 지금까지 내가 얻은 것은 다음과 같습니다.

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 범위를 취하고 반환하는 동반자 객체 a List:

scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)

유용한 것이 많이 있습니다 List 공장 방법 에서 List 수집 문서.

다른 팁

어떤 시퀀스를 돌리려면 s 목록에 사용하십시오 s.toList

그러나이 경우 DigitalRoss가 더 효율적이라고 확신합니다.

(2 to max) 아닙니다 scala.collection.immutable.list 실제로는하지만 a 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