순수함수

Pure function

컴퓨터 프로그래밍에서 순수 함수는 다음과 같은 [1][2]특성을 가진 함수입니다.

  1. 함수 반환 값은 동일한 인수(로컬 정적 변수, 비로컬 변수, 가변 참조 인수 또는 입력 스트림과의 변동 없음)에 대해 동일합니다.
  2. 함수 어플리케이션에는 부작용이 없습니다(로컬 정적 변수, 비로컬 변수, 가변 참조 인수 또는 입출력 스트림의 변환 없음).

따라서 순수한 함수는 수학 함수의 계산적 유사체이다.일부 저자, 특히 명령어 커뮤니티에서는 위의 속성[3][4] 2(아래 설명)를 가진 모든 기능에 대해 "순수"라는 용어를 사용합니다.

순수 함수

다음 C++ 함수의 는 순수합니다.

  • floor, 번호의 바닥을 반환한다.
  • max최대 2개의 값을 반환합니다.
  • 다음과 같이 정의되는 함수 f
    무효 f() {   정적인 표준::원자핵의< >서명되어 있지 않다 인트> x = 0;   ++x; } 
    이 코드 샘플은 순수하지 않은 것처럼 보이지만 실제로는 순수합니다.가치x다른 호출 안에서만 볼 수 있다f(), 및 로서f()가치를 전달하지 않다x그것의 환경에 있어서, 그것은 기능과 구별할 수 없다.void f() {}그건 아무 소용이 없어주의:xstd::atomic여러 스레드로부터의 수정이 실행되도록 하기 위해f()동시에 데이터 경합은 발생하지 않습니다.이것은 C와 C++의 동작을 정의하지 않습니다.

불순함수

다음 C++ 함수는 위의 속성1이 없기 때문에 불순합니다.

  • 정적 변수를 사용한 반환값 변동 때문에
    인트 f() {   정적인 인트 x = 0;   ++x;   돌아가다 x; } 
  • 로컬 변수가 아닌 반환값 변동 때문에
    인트 f() {   돌아가다 x; } 
    같은 이유로, 예를 들어 C++ 라이브러리 기능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에서는pureattribute는 속성 2를 지정하고,constattribute는 두 [9]속성을 모두 가진 순수 함수를 지정합니다.
  • 컴파일 시간 함수 실행을 제공하는 언어에서는 함수가 순수해야 하며 경우에 따라서는 다른 제약이 추가될 수 있습니다.예를 들면 다음과 같습니다.constexprC++(양쪽 속성).[10]

유닛 테스트

순수 함수는 동일한 인수에 대해 동일한 반환값을 가지므로 단위 테스트에 적합합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ 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.
  2. ^ 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.
  3. ^ a b "GCC 8.1 Manual". GCC, the GNU Compiler Collection. Free Software Foundation, Inc. 2018. Retrieved 2018-06-28.
  4. ^ Fortran 95 언어 기능 #순수 절차
  5. ^ 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.
  6. ^ 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.
  7. ^ Fortran의 순수 속성
  8. ^ D 언어의 순수 속성
  9. ^ "Common Function Attributes". Using the GNU Compiler Collection (GCC. Retrieved 22 July 2021.
  10. ^ constexpr 속성(C++)