2016-10-07 10 views
0
def fix[A, B](fn : Function2[Function1[A, B], A, B]) : Function1[A, B] = 
    (x : A) => fn(fix(fn), x) 

    lazy val fibs1 = fix[(Int, Int), Stream[Int]](
    (fn, a) => a._1 #:: fn((a._2, a._1 + a._2)) 
) 

    val fibs2 = fix[(Int, Int), Stream[Int]](
    (fn, a) => a._1 #:: fn((a._2, a._1 + a._2)) 
) 

스칼라를 배우는 동안 이상한 오류가 발생했습니다. 왜 fibs1((1,1))은 오류를 생성하지 않고 fibs2((1, 1))은 널 포인터 예외를 제공합니까?게으른 경우가 아니면 스칼라 NullPointerException이 발생합니다.

편집 :

이 코드는 응용 프로그램 클래스의 내부했다. instance.main(...)을 평가할 때까지 val이 초기화되지 않은 것으로 보입니다. lazy val에 대한 구현이 다르다고 가정합니다.

+0

fibs2에 NPE가 없습니다. 여기에 동일한 – Nyavro

+0

평가, 내가 그것을 실행할 때 NPE 없음 repl –

답변

0

당신 말이 맞습니다. 일부 val은 초기화되지 않았지만 게으른 val로 만들었으므로 필요할 때만 평가되었고 그 당시에는 제어하지 않는 코드로 초기화되었습니다.