복붙노트

[SCALA] toSet를 호출하여 매개 변수 유형 오류를 누락?

SCALA

toSet를 호출하여 매개 변수 유형 오류를 누락?

문자 목록에서 생성하려고 고유 문자 목록은 주파수 맵핑 - 예를 뭔가 같은 :

List('a','b','a') -> List(('a',2), ('b',1))

그래서 그냥 콘솔에서 주변의 일 처리,이 작품 :

val l = List('a', 'b', 'c', 'b', 'c', 'a')       
val s = l.toSet                                  
s.map(i => (i, l.filter(x => x == i).size))

하지만, 단지 마지막 두 줄을하지 않습니다 결합하여 단축?

l.toSet.map(i => (i, l.filter(x => x == i).size)) 

오류 "매개 변수 유형 누락"을 제공합니다.

스칼라는이 구문에 대해 불평하는 이유 누군가가 설명 할 수 있습니까?

해결법

  1. ==============================

    1.가장 구체적인 선택 - 당신은 컴파일러 수치는 발 S = l.toSet을 말할 때 toSet에 대한 유일한 합리적인 유형은 숯불입니다. 그런 다음, S는 샤아의 집합입니다 주어진, 컴파일러는지도가 숯불에서해야한다는 깨닫는다.

    가장 구체적인 선택 - 당신은 컴파일러 수치는 발 S = l.toSet을 말할 때 toSet에 대한 유일한 합리적인 유형은 숯불입니다. 그런 다음, S는 샤아의 집합입니다 주어진, 컴파일러는지도가 숯불에서해야한다는 깨닫는다.

    그러나 두 번째 경우에, 그것은 toSet 요소의 유형이 무엇인지에 대한 판단을 보류. 그것은 숯불 될 수도 있지만 AnyVal는 모든 것처럼, 작업도 할 것이다.

    l.toSet.map((i: Any) => (i, l.filter(x => x == i).size))
    

    일반적으로 규칙은 컴파일러가 가장 구체적인 값을 선택해야한다는 것입니다. 함수가 인수 contravariant 때문에 그들이 인수로를 취할 때 컴파일러가 결정할 수 있도록, 그들은, 가장 구체적인이다. ( "초기 가정을 선호한다") 타이를 중단하는 규칙이 존재할 수 있지만, 구현 사람은 없다. 그래서 당신의 도움을 요청합니다.

    당신은 문제를 해결하기 위해 함수 인수 또는 toSet에 두 종류를 제공 할 수 있습니다 :

    l.toSet.map((i: Char) => (i, l.filter(x => x == i).size))
    l.toSet[Char].map(i => (i, l.filter(x => x == i).size))
    
  2. ==============================

    2.toSet의 유형 [숯불]를 추가하면 트릭을 수행합니다.

    toSet의 유형 [숯불]를 추가하면 트릭을 수행합니다.

    scala> l.toSet[Char].map(i => (i, l.filter(x => x == i).size))
    scala.collection.immutable.Set[(Char, Int)] = Set((a,2), (b,2), (c,2))
    
  3. from https://stackoverflow.com/questions/13130013/missing-parameter-type-error-by-calling-toset by cc-by-sa and MIT license