2013-07-03 1 views
1

에 대한 변환 함수 :스칼라는, 범용 나는 다음과 같이 뭔가를하고 싶은 모든 객체

입니다
val onlyNice = true; 

val users: List[String] = getNames() 
val result = users 
    .filter(_.contains("john") 
    .map(._toUpperCase) 
    .filter(p => isNice) // here i would need to apply this filter only if `onlyNice` is true 
    .map(p => countryOf(p)); 

, 나는 단지 onlyNice==true 경우 isNice 필터를 적용 할.

val result = users 
    .filter(_.contains("john") 
    .map(._toUpperCase) 
    .filter(p => !onlyNice || isNice) 
    .map(p => countryOf(p)); 

을하지만 우리는 onlyNice이 거짓 인 경우에도 모든 목록을 통과하기 때문에 이것은 성능이 저하 될 것입니다 : 나는 다음과 같이 그것을 할 수 있습니다.

다음과 같이 우리가 할 수있는 :

val tmp = users 
    .filter(_.contains("john") 
    .map(._toUpperCase) 

val tmp2 = if (onlyNice) tmp.filter(isNice) else tmp 

val result = tmp2. 
    .map(p => countryOf(p)); 

는하지만 읽기가 더 어렵습니다.

이 나에게 좋은 일반화 된 솔루션을 보인다

implicit class ObjectHelper[A](o: A) { 
    def transform[B](f: A => B): B = f(o) 
} 

val result = users 
    .filter(_.contains("john") 
    .map(._toUpperCase) 
    .transform(list => if (onlyNice) list.filter(isNice) else list) 
    .map(p => countryOf(p)); 

당신은 어떻게 생각하십니까?

이것은 transform 함수가 이미 표준 스칼라 라이브러리 어딘가에 구현 되었습니까?

답변

1

transform은 본질적으로 기능 응용 프로그램의 뒤집힌 형식입니다.

표준 라이브러리의 구현에 대해서는 알지 못하지만 Scalaz 라이브러리에서 |> 연산자로 구현됩니다 (예 : 때문에,이 경우, 함수 타입이다 A => A

import scalaz.syntax.id._ 

users |> (list => if (onlyNice) list.filter(isNice) else list) 

참고보다는 A => B (즉 그것이 List[String] => List[String]이다)는 등가 identity 함수를 사용하여, 예를 들어

users |> (if (onlyNice) (_.filter(isNice)) else identity) 
+0

예제가 컴파일되지 않습니다 (오류 "찾을 수 없음 : 값 |>"). scalaz-core_2.10 7.0.0에 종속성을 추가하고 scalaz._를 가져 와서 컴파일 할 때 다른 것을 필요로합니까? 그리고 API 문서가 있습니까? 나는 단지 https://github.com/scalaz/scalaz에있는 일반 문서 페이지를 찾았습니다. –

+1

'scalaz.syntax.id._'에서 암시 적으로 가져와야합니다. 나는 이것을 나의 대답에 추가했다. –

+0

대단히 감사합니다. 어딘가 API 문서가 있습니까? syntax.id에 대해 어떻게 알아야합니까? –

관련 문제