2014-05-14 3 views
0

두 가지 기능이 있습니다. 하나는 masterChecker이고, Int x와 함수 p를 인수로 취하고 부울 결과 p (x)를 반환합니다. 그런 간단한. 그런 다음인수로 전달 된 수정 함수

def masterChecker(x: Int, p: Int => Boolean): Boolean = p(x) 

나는 그것을 실행하는 것이라고 방식으로, childCheckermasterCheker 호출 f을 변경할 수있는 방법이 있나요 masterChecker

def childChecker(x: Int, f: Int => Boolean): Boolean = masterChecker(x , f) 

별칭처럼 제 2 기능 childChecker을 가지고 !f?

처럼을 (F 리턴 true의 경우는 것은 거짓하기보다) :

// inside childChecker 
masterChecker(x, !f) 

내가 !masterChecker(x,f)으로 masterChecker 전화에 그것을 할 수 있다는 것을 알고 있지만, 내가 알고 싶은 것은 키우면 경우에 가능하다 인수로 전달 된 함수 동작을 변경합니다.

def childChecker(x: Int, f: Int => Boolean) = masterCheck(x, !f(_)) 

을하고 거기 당신은 간다 :

답변

4

물론, 당신과 같이 익명 함수를 사용할 수 있습니다! 당신이 childChecker의 기능 범위 내에서 f을 "수정"할 경우 더욱 더

, 당신은 여러 가지를 할 수 :

당신이 일반 팔자 다루고있는 재미의 일부
def childChecker(x: Int, f: Int => Boolean) ={ 
    def proxy(x: Int): Boolean ={ 
    val y: Int = //do things 
    f(y) //see? "y" not "x" 
    } 

    masterCheck(x, proxy) 
} 

'기능. 물론,이 "수정"은 데코레이터 패턴에 가깝지만 인터페이스에 충실합니다.

+0

def proxy (x : Int)가'def proxy (y : Int)'가 아니겠습니까? – lpiepiora

+0

@Ipiepiora 아니, 거기에 "y"를 의미했다. 그것은 전달 된 "x"가 아니라는 것을 강조하는 것입니다. "x"는 _3_을 추가하는 것과 같이 수정할 수 있습니다. – wheaties

+0

여기서'y'가'f' 함수에 전달됩니다. 거기에 처음으로 나타납니다. – lpiepiora

관련 문제