문제
나는 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)