2012-08-14 9 views
3

fs의 일반 유형은 무엇입니까?재귀 함수의 반환 유형

lazy val fs = List(2,3,4).zip(fs.tail) 

컴파일러는 컴파일 타임에 컴파일러가 설정하도록 요청합니다.

업데이트 : 나는 2 프로젝트 오일러 문제에 대한 솔루션을 고려하고 싶었 :

lazy val fs: Stream[Int] = 
     0 #:: 1 #:: fs.zip(fs.tail).map(p => p._1 + p._2) 

    fs.view.takeWhile(_ <= 4000000).filter(_ % 2 == 0).sum 

나는 다음 단계

답변

5

: 우리가 Stream을 사용하는 경우 이제 대신 우리는 런타임 오류가 발생하지 않습니다 뭔가를 할 수 있습니다. 물론 계산할 수 없으므로 실제 유형은 Nothing입니다. 우리가 암시 canBuildFrom에 대해 잊어 버린 경우

, List[A]에서 우편의 서명이 A = Int 인을 시작으로

def zip[B](l: List[B]) : List[(A,B)] 

것, 심지어는 고려하지 않고,] 우리는 List[(Int, B)이 분명하다의 인수 zipfs.tail입니다. 그 지식을 추가하면 우리는 이제 List[(Int, (Int, B))]을 가지고 거기에서 반복 할 수 있습니다. List[(Int,(Int, (Int, _)))]을 입력하고 원하는만큼 여러 레벨을 중첩시킬 수 있습니다.

저는 스칼라에서 가장 정확한 유형 (중첩을 무한대로)을 표현할 방법이 없다고 생각합니다. 어쨌든, 그것은 거주하지 않으며,이 유형은 값을 포함하지 않으며, fs는 계산 될 수 없습니다.

+0

@ ZoltanHamori 저는 이것이 사실이라고 확신하지 않습니다. 내 대답을 보라. –

+0

나는 아무것도 입력 할 수 없다는 데 동의하고, 그것을 (나는 그것을 시도 했었는데, 언급 했음) 알고 있었다.그 이유는 Nothing이 어떤 유형의 하위 유형이라도 호출 할 수있는 멤버가 없다는 것입니다 (이는 특별한 하위 유형이됩니다). 나는 영원히 반복 할 (또는 스택 오버플로) 무언가의 유형으로 Nothing을 입력하는 것을 의미했습니다. 나는 더 정확 했어야했다. –

+0

예'아무것도 아니지만 특별한 결과는'Nothing'에 결과를 입력 할 수 없다는 이유는 컴파일러에'List'가 필요하고'Nothing'은 아무것도없는'List'가 아니기 때문입니다.) 'Nothing'의 구성원이 무엇인지 할 수 있습니다. –

2

다음 컴파일에서 발생하는 디버깅하고 싶었을하지만, fs에 접근하는 것은 생성 StackOverflowError은 정의가 자연을 재귀하기 때문에 발생합니다.

lazy val fs:List[Product] = List(2,3,4).zip(fs.tail) 

우리가 같은 것을 할 수있는 유형에 대한 구체적 싶었다 경우 : typle이 Nothing하지

lazy val fs:List[(Int, (Int, Product))] = List(2,3,4).zip(fs.tail) 

합니다. 다음은 컴파일되지 않기 때문에 :

scala> lazy val fs:Nothing = List(2,3,4).zip(fs.tail) 
<console>:8: error: value tail is not a member of Nothing 
    lazy val fs:Nothing = List(2,3,4).zip(fs.tail) 

비슷한 유형의 오류가 발생 우리가 List[Nothing], List[(Int, Nothing)] 등으로 FS를 정의하는 경우 등 그래서 명확하게 표현의 유형은 ProductList입니다. 내가 그것을 설명하는 것이 가장 정확한 유형이 있다고 생각하지 않습니다

scala> lazy val fs:Stream[Any] = 0 #:: 1 #:: fs.zip(fs.tail).map(p => p:Any) 
fs: Stream[Any] = <lazy> 

scala> fs take 5 foreach println 
0 
1 
(0,1) 
(1,(0,1)) 
((0,1),(1,(0,1))) 
0

나는 모양, 형태 안전한 방법으로이 수를 생각하지 않는다 :

scala> lazy val fs=List(1,2,3).zip(fs.tail) 
<console>:7: error: recursive lazy value fs needs type 
     lazy val fs=List(1,2,3).zip(fs.tail) 
           ^

scala> lazy val fs:List[(Int,Int)]=List(1,2,3).zip(fs.tail) 
<console>:7: error: type mismatch; 
found : List[(Int, (Int, Int))] 
required: List[(Int, Int)] 
     lazy val fs:List[(Int,Int)]=List(1,2,3).zip(fs.tail) 

가 적어도 내가 어떤 유용한 결과를 달성하는 방법을 볼 수 없습니다. 당신의 의도는 무엇입니까? 그것은 당신의 원하는 결과

scala> val l = List(1,2,3) 
l: List[Int] = List(1, 2, 3) 

scala> val fs = l.zip(l.tail) 
fs: List[(Int, Int)] = List((1,2), (2,3)) 

이다 : 우리가 이것을 할 수있는 반면에

?