2016-07-07 2 views
2

을 감안할 때 :Call By-Name이있는 Higher Order Function?

def higherOrderCallByName(f: => Int => Int, x: Int): Int = f(x) 
def higherOrderCallByValue(f: Int => Int, x: Int): Int = f(x) 

어떤 상황에서 그/관용적 적절한이다는 A A 기능 인수에 의해 이름 higherOrderCallByName에서 즉 f을 전화를 사용할 수 있나요?

+3

기능을 생산하는 데 비용이 많이 드는 전화 인 경우? –

+1

스칼라 함수가 기본적으로 call-by-name이라는 점에서 차이가 있다고 생각하지 않습니다. 인수를 함수로 전달하고 값을 call-by-value로 지정해도 아무런 차이가 없습니다. 나는 이것을 작은 데모 기능으로 테스트했다. 내가 틀렸다면 나를 바로 잡아라. – Abhi

+0

@ManjeetKumar ** 스칼라 함수는 기본적으로 이름 별 호출입니다 **이 예제를 사용하여 지원할 수 있습니까? 나는 전형적으로 가치에 의한 것이라고 생각합니다. 아래 예를 참조하십시오. –

답변

3

단에서 명확히 이 될 때까지 매개 변수 통화 별 이름 평가에서 지연 상태가 함수에 전달되기 전에 유도함으로써 값 파라미터의 값을 판정한다 함수 내에서 사용됩니다.

내가 m-z와 일치하면 higherOrderCallByName은 전달 된 함수가 값 비싼 호출 일 수있는 곳에서 완벽하게 유효합니다.

내가 생각할 수있는 또 다른 시나리오는 전달 된 함수에 부작용이있는 경우 by-name 매개 변수가 by-value 매개 변수와 다르게 동작한다는 것입니다. 나는 이것을 설명하기 위해 예를 수정 :

def higherOrderCallByName(f: => Int => Int, x: Int): Int = { 
    println("Inside by-name function.") 
    f(x) 
} 

def higherOrderCallByValue(f: Int => Int, x: Int): Int = { 
    println("Inside by-value function.") 
    f(x) 
} 

def funWithSideEffect() : (Int) => Int = { 
    println("Some side effect.") // some side-effect or some expensive call 
    x => x + 1 // returns function which increments param 
} 

을 이제 higherOrderCallByValue(funWithSideEffect(), 2) 출력이됩니다 호출하는 경우 :

Some side effect. 
Inside by-value function. 

출력에서 ​​알 수 있듯이, 부작용이 higherOrderCallByValue의 몸이 실행 전에 발생합니다.

higherOrderCallByName(funWithSideEffect(), 2) 같이 출력 될 것이다 반면 : f(x) 만나면

Inside by-name function. 
Some side effect. 

부작용이higherOrderCallByName 내부 발생 어디. 이제 f(x)higherOrderCallByName 안에 여러 번 실행되는 시나리오를 상상해보십시오. 분명히 그것은 여러분의 어플리케이션에 많은 영향을 줄 것입니다.

+0

부작용 외에도 기능이 "비싸다"는 다른 이유는 무엇입니까? –

+0

앞서 언급했듯이,'funWithSideEffect'는 또한 값 비싼 처리를 할 수 있습니다. 이것에 기초하여 계산을 나중에 언젠가 연기 할 수 있는지 결정하기를 원할 것입니다. –

관련 문제