순수함수
Pure function컴퓨터 프로그래밍에서 순수 함수는 다음과 같은 [1][2]특성을 가진 함수입니다.
- 함수 반환 값은 동일한 인수(로컬 정적 변수, 비로컬 변수, 가변 참조 인수 또는 입력 스트림과의 변동 없음)에 대해 동일합니다.
- 함수 어플리케이션에는 부작용이 없습니다(로컬 정적 변수, 비로컬 변수, 가변 참조 인수 또는 입출력 스트림의 변환 없음).
따라서 순수한 함수는 수학 함수의 계산적 유사체이다.일부 저자, 특히 명령어 커뮤니티에서는 위의 속성[3][4] 2(아래 설명)를 가진 모든 기능에 대해 "순수"라는 용어를 사용합니다.
예
순수 함수
다음 C++ 함수의 예는 순수합니다.
floor
, 번호의 바닥을 반환한다.max
최대 2개의 값을 반환합니다.- 다음과 같이 정의되는 함수 f이 코드 샘플은 순수하지 않은 것처럼 보이지만 실제로는 순수합니다.가치
무효 f() { 정적인 표준::원자핵의< >서명되어 있지 않다 인트> x = 0; ++x; }
x
다른 호출 안에서만 볼 수 있다f()
, 및 로서f()
가치를 전달하지 않다x
그것의 환경에 있어서, 그것은 기능과 구별할 수 없다.void f() {}
그건 아무 소용이 없어주의:x
이std::atomic
여러 스레드로부터의 수정이 실행되도록 하기 위해f()
동시에 데이터 경합은 발생하지 않습니다.이것은 C와 C++의 동작을 정의하지 않습니다.
불순함수
다음 C++ 함수는 위의 속성1이 없기 때문에 불순합니다.
- 정적 변수를 사용한 반환값 변동 때문에
인트 f() { 정적인 인트 x = 0; ++x; 돌아가다 x; }
- 로컬 변수가 아닌 반환값 변동 때문에같은 이유로, 예를 들어 C++ 라이브러리 기능
인트 f() { 돌아가다 x; }
sin()
결과는 실행 시 변경할 수 있는 IEEE 반올림 모드에 따라 다르기 때문에 순수하지 않습니다. - 가변 참조 인수에 의한 반환값 변동 때문에
인트 f(인트* x) { 돌아가다 *x; }
- 입력 스트림에 따른 반환값 변동 때문에
인트 f() { 인트 x = 0; 표준::신 >> x; 돌아가다 x; }
다음 C++ 함수는 위의 속성 2가 없기 때문에 불순합니다.
- 로컬 스태틱 변수의 변환으로 인해
무효 f() { 정적인 인트 x = 0; ++x; }
- 비국소 변수의 돌연변이로 인해
무효 f() { ++x; }
- 가변 참조 인수의 돌연변이 때문에
무효 f(인트* x) { ++*x; }
- 출력 스트림의 돌연변이로 인해
무효 f() { 표준::외치다 << > "안녕, 세상아!" << > 표준::끝; }
다음 C++ 함수는 위의 속성1과 2가 모두 없기 때문에 불순합니다.
- 로컬 스태틱 변수에 의한 반환값 변동 및 로컬 스태틱 변수의 변환에 의해
인트 f() { 정적인 인트 x = 0; ++x; 돌아가다 x; }
- 입력 스트림에 의한 반환값 변동 및 입력 스트림의 변환 때문에
인트 f() { 인트 x = 0; 표준::신 >> x; 돌아가다 x; }
순수 기능의 I/O
I/O는 본질적으로 불순합니다.입력 조작은 참조의 투명성을 해치고 출력 조작은 부작용을 낳습니다.다만, 관련 I/O 디바이스의 조작 시퀀스가 인수와 결과로서 명시적으로 모델링되어 입력 시퀀스가 프로그램 실행 개시 후에 실제로 행해진 조작을 기술하지 않는 경우, I/O 조작이 실패하는 경우, 함수는 입출력 또는 출력을 실행할 수 있다는 의미가 있다.이온
두 번째 포인트는 인수로 사용할 수 있는 시퀀스만 각 I/O액션에 따라 변경되도록 합니다.첫 번째 포인트는 시퀀스 인수가 [5][6]변경되었기 때문에 I/O 수행 함수에 대한 다른 콜이 다른 결과를 반환할 수 있도록 합니다.
I/O 모나드는 일반적으로 순수 기능 언어로 I/O를 수행하기 위해 사용되는 프로그래밍 관용어입니다.
컴파일러 최적화
위의 속성 2만을 가진 함수는 연산자와 [3]유사한 공통 서브 표현식 제거 및 루프 최적화와 같은 컴파일러 최적화 기술을 허용합니다.C++의 예를 다음에 나타냅니다.length
메서드, 문자열의 크기를 반환합니다.이것은 문자열이 가리키는 메모리 내용에 따라 다르므로 위의 속성 1이 없습니다.단, 싱글 스레드 환경에서는 다음 C++ 코드
표준::스트링 s = "안녕, 세상아!"; 인트 a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 인트 l = 0; 위해서 (인트 i = 0; i < > 10; ++i) { l += s.길이() + a[i]; }
가치가 있도록 최적화할 수 있다s.length()
루프 전에 한 번만 계산됩니다.
일부 프로그래밍 언어에서는 함수에 순수 속성을 선언할 수 있습니다.
- Fortran 및 D에서는
pure
키워드를 사용하여 함수가 단순히 부작용이 없음을 선언할 수 있습니다(즉, 위의 속성 [7]2만 있음).컴파일러는 선언 [8]위에 속성 1을 추론할 수 있습니다. - GCC에서는
pure
attribute는 속성 2를 지정하고,const
attribute는 두 [9]속성을 모두 가진 순수 함수를 지정합니다. - 컴파일 시간 함수 실행을 제공하는 언어에서는 함수가 순수해야 하며 경우에 따라서는 다른 제약이 추가될 수 있습니다.예를 들면 다음과 같습니다.
constexpr
C++(양쪽 속성).[10]
유닛 테스트
순수 함수는 동일한 인수에 대해 동일한 반환값을 가지므로 단위 테스트에 적합합니다.
「 」를 참조해 주세요.
- 컴파일 시 함수 실행 : 컴파일 시 순수 함수 평가
- 결정론적 알고리즘
- 순수하게 기능하는 데이터 구조
- 람다 미적분
- 부작용(컴퓨터 과학)
- 순수 절차
- 등가성
- Fortran의 pure 키워드(순수 함수 주석)
- C++의 constexpr 키워드: 컴파일 시 사용 가능한 순수 함수 주석
레퍼런스
- ^ Bartosz Milewski (2013). "Basics of Haskell". School of Haskell. FP Complete. Archived from the original on 2016-10-27. Retrieved 2018-07-13.
Here are the fundamental properties of a pure function: 1. A function returns exactly the same result every time it's called with the same set of arguments. In other words a function has no state, nor can it access any external state. Every time you call it, it behaves like a newborn baby with blank memory and no knowledge of the external world. 2. A function has no side effects. Calling a function once is the same as calling it twice and discarding the result of the first call.
- ^ Brian Lonsdorf (2015). "Professor Frisby's Mostly Adequate Guide to Functional Programming". GitHub. Retrieved 2020-03-20.
A pure function is a function that, given the same input, will always return the same output and does not have any observable side effect.
- ^ a b "GCC 8.1 Manual". GCC, the GNU Compiler Collection. Free Software Foundation, Inc. 2018. Retrieved 2018-06-28.
- ^ Fortran 95 언어 기능 #순수 절차
- ^ Peyton Jones, Simon L. (2003). Haskell 98 Language and Libraries: The Revised Report (PDF). Cambridge, United Kingdom: Cambridge University Press. p. 95. ISBN 0-521 826144. Retrieved 17 July 2014.
- ^ Hanus, Michael. "Curry: An Integrated Functional Logic Language" (PDF). www-ps.informatik.uni-kiel.de. Institut für Informatik, Christian-Albrechts-Universität zu Kiel. p. 33. Archived from the original (PDF) on 25 July 2014. Retrieved 17 July 2014.
- ^ Fortran의 순수 속성
- ^ D 언어의 순수 속성
- ^ "Common Function Attributes". Using the GNU Compiler Collection (GCC. Retrieved 22 July 2021.
- ^ constexpr 속성(C++)