복붙노트

[SCALA] List.filter에 밑줄

SCALA

List.filter에 밑줄

왜이 작동하지 않습니다 :

List(true,false).filter(_).size

이 오류는 말합니다 :

<console>:8: error: missing parameter type for expanded function 
((x$1) => List(true, false).filter(x$1).size)
    List(true,false).filter(_).size
                            ^

하지만 다음 작품은 (나를 위해 그냥 같은 모양) :

List(true,false).filter(a => a).size

나는 스칼라 2.9.0.1을 사용하고 있습니다.

해결법

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

    1._의 취급 스칼라에서 나는 오류 처리가 조금 개선해야한다고 생각 보조 노트로 조금 까다 롭습니다. 주제로 돌아 가기, 예를 보라 :

    _의 취급 스칼라에서 나는 오류 처리가 조금 개선해야한다고 생각 보조 노트로 조금 까다 롭습니다. 주제로 돌아 가기, 예를 보라 :

    def twice(i: Int) = i * 2
    def gt2(j: Int) = j > 2
    
    List(1,2,3) filter gt2
    

    예상대로이 잘하고 작품을 컴파일합니다. 그러나 비밀 오차 작성 기능의 결과를 시도 :

    List(1,2,3) filter gt2(twice(_))
    
      error: missing parameter type for expanded function ((x$1) => twice(x$1))
              List(1,2,3) filter gt2(twice(_))
                                         ^ 
    

    어떻게 된 거예요? 그것은 두 번 (_)이 경우는 가장 직접적인 문맥으로 바인드 강조 스칼라 컴파일러는보고 기본적으로 할 때. 이것은 우리가 지금 인수로 두 번 기능 GT2 ()를 호출하는 것을 의미한다. 어떤 컴파일러가 알고있는 것은이 함수는 인자를 가지고 동일한 유형을 반환한다는 것입니다. 틀림없이 그가 나중에이 파악 될 때까지 그러나 일시적 X $ (1) 자리를 사용, 지능 회 () 서명을 기반으로이 인수와 리턴 타입의 종류를 파악해야한다.

    불행하게도 우리가 기능을 제공하는 동안 GT2 ()가 int를 기대하고 그렇게 할 수없는 (컴파일러가 생각하는 것입니다 그 이상).

    않는 이유를 이렇게 :

    List(1,2,3) filter {k => gt2(twice(k))}
    

    작업? 컴파일러는 사전에 K의 유형을 알 수 없습니다. 그러나 그 GT2 반환 부울을 알고 int를 기대했다. 또한 두 번 ()가 아니라 지능 반환을 기대 것을 알고있다. 이 방법은 K의 유형을 유추합니다. 반면에 컴파일러는 필터가 지능 => 부울을 기대하는 처음부터 알고있다.

    그 존재는 당신의 사건에 다시 말했다. 밑줄 혼자 ((_)) 다른 대부분의 즉각적인 둘러싸는 컨텍스트에 대한 컴파일러 검색 그래서 "상황"을 고려하지 않습니다. 는! 자체 기능뿐만 아니라 _ ​​== true로 간주되었을 것이다 _. 그러나 혼자가 밑줄.

    따라서이 경우에는 가장 가까운 즉각적인 컨텍스트 (나는 ... 확인하십시오에 대한 과학적인 이름이있어) 무엇인가? 음, 전체 표현식 :

    (x$1) => List(true, false).filter(x$1).size
    

    목록 (참, 거짓) .filter (X $ 1) 크기는 : 컴파일러는 알 수없는 유형과 표현의 유형의 반환 무언가의 일부 매개 변수를 사용하는 함수를 만들려고 생각합니다. 또 다시 논란의 여지가 해당 필터를 알아낼 수 있어야 부울 => 부울 반환 지능 (크기는가) 필요하지만 분명히 그렇지 않습니다.

    그래서 당신은 무엇을 할 수 있습니까? 당신은 컴파일러에게 밑줄이 작은 맥락에서 해석해야한다는 힌트를주고있다. 당신은 말할 수 있습니다 :

    List(true,false) filter (_ == true)
    List(true,false) filter (i => i)
    List(true,false) filter identity
    
  2. ==============================

    2.스칼라 _의 확인을 해야할지하지 않기 때문에 첫 번째 오류입니다. 그래서 이것을 시도 ...

    스칼라 _의 확인을 해야할지하지 않기 때문에 첫 번째 오류입니다. 그래서 이것을 시도 ...

    List(true,false).filter(_:Boolean).size
    

    그 후, 당신은 더 많은 정보를 얻을 :

    <console>:8: error: type mismatch;
    found   : Boolean
    required: (Boolean) => Boolean
     List(true,false).filter(_:Boolean).size
    

    그냥 단지 값이 아닌 함수로 _, 평가입니다. ScalaDoc 당

    filter (pred: (A) ⇒ Boolean): GenTraversable[A] 
    
  3. ==============================

    3.나는 오류 메시지가 많이 개선되어보세요! 의 당신이 쓴 오류 메시지가 말했다보고, 당신의 작업 버전 보자 :

    나는 오류 메시지가 많이 개선되어보세요! 의 당신이 쓴 오류 메시지가 말했다보고, 당신의 작업 버전 보자 :

    ((x$1) => List(true, false).filter(x$1).size)
              List(true,false).filter(a => a).size
    

    또는, 공백, 괄호 및 변수 이름을 조정 :

    a => List(true, false).filter(a     ).size
         List(true, false).filter(a => a).size
    

    지금 같은 보입니까?

    당신이 매개 변수 대신 밑줄을 통과 할 때 간단히, 당신은 부분적인 기능의 응용 프로그램을하고 있습니다. 당신은 아마 같은, 그것은 표현에 나타납니다 때 발생하는 것입니다 익명 함수에서 매개 변수 자리 표시 자로 사용되는 밑줄 더 잘 알고있는 _ + 1이 두 가지가 사용하는 익명 함수에서 심지어 그들이 경우 모두 결과, 다르다.

  4. from https://stackoverflow.com/questions/7695270/underscore-in-list-filter by cc-by-sa and MIT license