2013-11-01 2 views
1

나는 "99 Scala Problems"을 차지했고, Goldbach 추측 인 Problem 40을 발견했습니다. 스칼라의 익명 값에 대한 참조

나는, 실제로 합 주어진 숫자입니다 소수의 모든 쌍을 출력하는이 솔루션을 내놓았다 : 완벽

def goldbach(n : Int) = { 
    val lprimes = listPrimesinRange(2 to n) // all primes less than n 
    lprimes.takeWhile(x=> x < (n-x)).filter(x=> lprimes.contains(n-x)).map(x=> (x,n-x)) 
} 

작동하지만, 한 - 라이너가 없습니다. 그리고 이것은 필터 연산에서 초기 소수 목록을 참조해야하기 때문입니다. 다음과 같이 작성할 수 있습니까?

def goldbach(n : Int) = { 
    listPrimesinRange(2 to n).takeWhile(x=> x < (n-x)).filter(x=> ???.contains(n-x)).map(x=> (x,n-x)) 
} 

... 여기서 '???' 적절한 표현으로 대체 될 것인가?

좋아요, 익명의 값에 대해 '이름'을 묻는 것은 자기 모순이라고 이해합니다. 그러나, 재미를 위해서만이 문제를 해결하고 있기 때문에, 이것은 스칼라 내부에 대해 알아낼 수있는 기회입니다. 이 비유적인 1 라이너 방식에서 처음에는 'lprimes'목록이 실제로 내부적으로 표현됩니다. 이 내부 표현에 액세스 할 수 있습니까? 아니면 우리가 정말로 피해야하는 것입니까?

답변

1

아니요, 가능하지 않다고 생각합니다.

implicit class RichAny[A](x: A) extends AnyVal { 
    def use(f: A => B) = f(x) // could have a better name 
} 

listPrimesinRange(2 to n).takeWhile(x=> x < (n-x)). 
    use(primes => primes.filter(x => primes.contains(n-x)) 
+0

나는 그 방법을 원하는대로 사용 : 당신 다음과 같이 작동 것이다 당신의 자신의 확장 방법을 쓸 수 있습니다! 엘리먼트가 아닌 콜렉션을 노출하는 일반적인 함수. 이 후부터 영감을 받아 listPrimesinRange를 List [List]와 같이 다음과 같이 묶어서 처리했습니다. List (listPrimesinRange (2)). (x => (x, nx)) 'takewhile'이 (가) 재배치되었다는 사실을 염두에 두십시오. 원래 장소에서는 작동하지 않습니다. – theodojo

관련 문제