[SCALA] List.filter에 밑줄
SCALAList.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._의 취급 스칼라에서 나는 오류 처리가 조금 개선해야한다고 생각 보조 노트로 조금 까다 롭습니다. 주제로 돌아 가기, 예를 보라 :
_의 취급 스칼라에서 나는 오류 처리가 조금 개선해야한다고 생각 보조 노트로 조금 까다 롭습니다. 주제로 돌아 가기, 예를 보라 :
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.스칼라 _의 확인을 해야할지하지 않기 때문에 첫 번째 오류입니다. 그래서 이것을 시도 ...
스칼라 _의 확인을 해야할지하지 않기 때문에 첫 번째 오류입니다. 그래서 이것을 시도 ...
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.나는 오류 메시지가 많이 개선되어보세요! 의 당신이 쓴 오류 메시지가 말했다보고, 당신의 작업 버전 보자 :
나는 오류 메시지가 많이 개선되어보세요! 의 당신이 쓴 오류 메시지가 말했다보고, 당신의 작업 버전 보자 :
((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이 두 가지가 사용하는 익명 함수에서 심지어 그들이 경우 모두 결과, 다르다.
from https://stackoverflow.com/questions/7695270/underscore-in-list-filter by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 루비 #tap 방법 상당 [중복] (0) | 2019.11.13 |
---|---|
[SCALA] 스칼라 정규식 일치 자바 하나의 성공, 실패 (0) | 2019.11.13 |
[SCALA] 스파크 데이터 세트 컬럼 내로 ADT / 밀봉 특성 계층을 인코딩 (0) | 2019.11.13 |
[SCALA] 가져 오기 TypeTag [A] 클래스에서 [A] (0) | 2019.11.13 |
[SCALA] 어떻게하면 saveAsTextFile RDD [(문자열, INT)]에 기록 괄호를 제거하려면? (0) | 2019.11.13 |