2017-12-21 7 views
0

형식 불일치로 인해 아래 코드는 컴파일되지 않으며, List[Int]에 명시 적으로 형식 매개 변수를 지정하여 해결할 수 있다고 가정합니다. 그러나 Nil에 Cann 어떻게 그걸 알아 냈어? 합니다 (foldRight 방법에 대한 몇 가지 정보가 있지만 여기 /:를 사용하고 싶습니다)초기 값 설정 방법/:(foldRight 아님)

val li = List.range(1, 10) 
(Nil /: li)((a, b) => b :: a) // doesn't compile 
(List(0): li)((a, b) => b :: a) // compiles 

<pastie>:14: error: type mismatch; 
found : List[Int] 
required: scala.collection.immutable.Nil.type 
     (Nil /: li)((a, b) => b :: a) 
          ^

사람이이 문제를 해결하는 방법을 알 수 있을까요?

+1

'/ :'는 'foldReft'가 아닌'foldLeft'와 동일합니다. – jwvh

+0

작전. 나는 항상이 두 가지와 혼동합니다. 감사. – hirofujitaaki

답변

0

그것의 당신이, 당신이 Nil.type등의 형식 매개 변수를 제공하고 초기 값으로 Nil을 제공 할 때, 때문에 및 따라서 오류가 발생하고 있습니다. 당신이 /: 방법 정의를 참조하면

def /:[B](z: B)(op: (B, A) => B): B 

, 그것은 고차 함수를 매개 변수로 기능 op입니다. op의 함수 유형 (예 : (B, A) => B)을 보면 반환 유형은 B입니다. /:Nil /: li으로 호출하면 전달되는 매개 변수는 Nil.type, 즉 Nil /:[Nil.type] li이됩니다. 따라서 BNil.type입니다. 여기 (Nil /: li)((a, b) => b :: a) , 당신은 문자 그대로 함수에 b::a 반환됩니다

지금, 매개 변수 op에 대한 문자 함수에서 볼 수 있습니다. 자세히 살펴보면 liList[Int]이고 aList() (즉, 값이 Nil)이기 때문에 b 유형은 Int입니다. 따라서 b :: aList[Int] 유형을 반환합니다. 그러나 함수 유형 opB이고 반환 유형은 Nil.type이지만 위에 설명 된대로 List[Int] 유형을 반환합니다. 따라서 오류가 발생합니다.

대신 Nil의 초기 값으로 List(0)를 제공

, 당신은 따라서는 일, B의 유형으로 그리고 문자 함수 b::a의 반환 형식이 List[Int] 인에 List[Int]을 전달하고 있습니다.

(List(0): li)((a, b) => b :: a) ~~ (List(0)/[List[Int]] li)((a, b) => b :: a) 

이 문제를 방지하려면 /: 메서드에 매개 변수를 명시 적으로 제공해야합니다.

(Nil /:[List[Int]] li)((a, b) => b :: a) 
+0

은 아름답게 작동하며 자세한 설명에 감사드립니다. 지금 나는 이유가있다. – hirofujitaaki

2

어떻게 사용에 대한 ...

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

scala> (List.empty[Int] /: li)((a, b) => b :: a) 
res20: List[Int] = List(9, 8, 7, 6, 5, 4, 3, 2, 1) 
0

그것은 사랑스러운 아니지만

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

scala> ((Nil : List[Int]) /: li)((a, b) => b :: a) 
res0: List[Int] = List(9, 8, 7, 6, 5, 4, 3, 2, 1)