순수한 함수는 부작용이없는 함수입니다 (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
변수의 값이 변경되므로 큰 차이가 있습니다.
https://en.wikipedia.org/wiki/Pure_function을 보셨습니까? – Bergi
그 과정에서 다른 학습 자료에 대한 많은 참고 자료가 있습니다. 먼저 확인하거나 코스 포럼을 사용하는 것이 좋습니다. – Pavel
@Rodrigo 이것은 람다 미적분이 합류하는 [Church-Rosser theorem] (https://en.wikipedia.org/wiki/Church%E2%80%93Rosser_theorem)의 비공식적 인 표현입니다. 스칼라에 대한 정리를 사용하는 것은 언어의 특정 순수 하위 집합에만 적용되기 때문에 용어를 약간 남용하기 때문에 참조하는 구는 아마도 거기에있을 것이다. – phg