2

저는 기능 프로그래밍에 대한 Coursera 과정에서 일하고 있으며 어느 시점에서 값 별 호출과 이름 별 호출 평가 기법의 차이점을 논의합니다. 그들은, 그들이 나를 혼란 어떤 점을 말하는 것 :값 별 및 이름 별 동일성

  1. 감소 된 표현은 순수 기능으로 구성되어 있으며
  2. 모두 평가 종료 :로

    두 기술 한 같은 최종 값으로 감소

이것은 람다 미적분학의 정리 인 것으로 보인다.

"감소 된 표현은 순수 함수를 중요시합니다"라는 의미를 설명해 주시겠습니까?

+2

https://en.wikipedia.org/wiki/Pure_function을 보셨습니까? – Bergi

+0

그 과정에서 다른 학습 자료에 대한 많은 참고 자료가 있습니다. 먼저 확인하거나 코스 포럼을 사용하는 것이 좋습니다. – Pavel

+1

@Rodrigo 이것은 람다 미적분이 합류하는 [Church-Rosser theorem] (https://en.wikipedia.org/wiki/Church%E2%80%93Rosser_theorem)의 비공식적 인 표현입니다. 스칼라에 대한 정리를 사용하는 것은 언어의 특정 순수 하위 집합에만 적용되기 때문에 용어를 약간 남용하기 때문에 참조하는 구는 아마도 거기에있을 것이다. – phg

답변

4

순수한 함수는 부작용이없는 함수입니다 (IO를 수행하거나 함수에 국한되지 않는 값을 변경하는 등). 순수 기능의 예는 다음과 같습니다

def inc(x: Int) = x+1 

는 불순한 기능의 예는 다음과 같습니다

var sum = 1 
def addToSum(x: Int) = { 
    sum += x 
    sum 
} 

그래서 지금의 그들이 그들의 인수를 여부에만 차이가 다음 두 가지 방법을 생각해 보자 이름이나 값으로 : 이제 우리는 순수한 기능이 두 가지를 사용하는 경우

def doubleByValue(x: Int) = x + x 
def doubleByName(x: =>Int) = x + x 

, 결과는 동일합니다 :

doubleByValue(inc(2)) // => 6 
doubleByName(inc(2)) // => 6 

그러나 우리는 불순한 기능에 적용 할 경우, 결과는 다릅니다

sum = 1 // Let's reset sum, so the result isn't affected by previous uses 
doubleByValue(addToSum(2)) // => 6, the value of `sum` is now 3 
sum = 1 // Let's reset sum, so the result isn't affected by previous uses 
doubleByName(addToSum(2)) // => 8, the value of `sum` is now 5 

차이 ByValue 버전은 한번 호출 반면 ByName 버전, 두 번 함수를 호출하고,이 개 결과를 추가하는 것입니다 결과를 저장하고 그 결과를 그 자체에 추가합니다.

순수 함수의 경우 이것은 동일한 차이가 없습니다. 동일한 인수를 사용하면 항상 동일한 결과가 반환되므로 한 번 호출하고 저장된 결과를 두 번 사용하는지 또는 두 번 호출하는지 여부는 아무런 차이가 없습니다 (단, 성능을 위해).

불순한 함수의 경우 함수가 호출 될 때마다 sum 변수의 값이 변경되므로 큰 차이가 있습니다.