밤에 쓴 코드

FP) Pure Function - 순수함수 본문

FP

FP) Pure Function - 순수함수

붱이🦉 2019. 5. 10. 10:26

Pure Function


함수형 프로그래밍에서의 함수는 기존의 함수와 메서드와는 구분하기 위해서 순수함수라는 표현을 사용합니다.

순수함수'특정 input에 대해서 항상 동일한 output을 반환하는 함수'를 의미합니다.

순수함수는 부수효과(side-effect) 가 존재 하지 않습니다.

부수효과가 존재한다는 것은 함수가 내부에서 일처리를 함에 다른 추가적인 효과들이 발생하는 것입니다.

var sum = 0

func add(numbers:[Int]){
    return numbers.reduce(sum,number)
}

위의 예 와 같이 add라는 함수는 sum이라는 외부의 값을 사용하는 경우도 부수효과가 발생합니다.

함수에 동일한 입력을 넣는다고 해도 , 참조하는 외부의 값이 다를 경우 , 다른 결과가 나올수 있게됩니다.

let sum = 0

func add(numbers:[Int]){
    return numbers.reduce(sum,number)
}

위의 경우처럼 외부의 값이 let으로 정의되어 있다면 사이드이펙트로 부터 자유로울 수 있겠습니다.

위의 경우 언제나 *동일한 Input 에 동일한 Output *을 뱉어 내기 때문에 순수함수입니다.

var sum = 0

func add(numbers:[Int]){
    for number in numbers {
    sum += number
  }
  return number 
}

또 외부의값을 함수 내부에서 변경하고 있습니다.

이 또한 외부의 값을 변경하는 부수효과를 내고 있습니다.

func add(numbers:[Int]){
  var sum = 0 
    for number in numbers {
    sum += number
  }
  return number 
}

변수를 내부로 옮김으로써 , 외부의 영향을 주지도 , 받지도 않게 되었습니다.

그로 인해 언제나 동일한 Input에 동일한 Output을 반환하게됩니다.

이로써 순수함수가 되었습니다.

func add(_ a: Int) -> Int {
return Int(arc4random()) + a
}

위의 경우는 외부의 영향을 주지도 , 받지도 않아 부수효과(side-effect) 에서는 자유로우나

동일한 Input에 Output을 반환하지 않습니다.

위의 경우는 순수함수로는 탈락입니다.

순수함수는 언제나 동일한 Input에 동일한 Output을 반환하게됩니다 , 그 과정에서 부수효과에서는 자유롭게 됩니다.

Comments