함수형 프로그래밍: 두 판 사이의 차이

내용 삭제됨 내용 추가됨
3 개의 출처 구조, 0 개의 링크를 깨진 것으로 표시) #IABot (v2.0
TedBot (토론 | 기여)
잔글 봇: 틀 이름 및 스타일 정리
33번째 줄:
y = z * z;
와는 다른 결과를 갖게 된다. 마찬가지로
<sourcesyntaxhighlight lang="c">
y = printf("x") * printf("x");
</syntaxhighlight>
</source>
에서 printf가 화면에 글자를 출력하는 함수라면, 이 함수는 부작용을 발생시키며 따라서 순수한 함수라고 볼 수 없다. C의 printf 함수는 "x"가 정상적으로 출력되었느냐 여부에 따라 0이나 1 값을 반환한다. 따라서 정상적인 경우 y는 1이 되겠지만, printf 함수가 제대로 출력하지 못하는 경우 0이 될 수도 있으므로 순수한 함수라고 볼 수 없다.
 
== 익명 함수 ==
'''익명 함수(anonymous function)'''란, 이름이 없는 함수를 뜻한다. 전통적인 명령형 언어에서는 모든 함수에 이름이 부여되어야만 한다. 예컨대 인수를 제곱하는 함수를 [[C 언어]]로 작성한다면 다음과 같이 작성할 수 있을 것이다.
<sourcesyntaxhighlight lang="c">
int square(int x) { return x * x; }
</syntaxhighlight>
</source>
 
그러나 함수형 언어에서는 이 함수를 익명함수로 작성할 수 있다.
 
다음은 [[하스켈]]로 작성한 제곱 함수이다.
<sourcesyntaxhighlight lang="haskell">
\x -> x * x
</syntaxhighlight>
</source>
여기서 <code>\x</code>의 역빗금 <code>\</code>은 람다 계산법의 람다를 의미한다. 위 함수를 람다 표현으로 나타내면 <math>\lambda x.\,x \times x</math>가 된다.
 
[[C++11]]에서는 다음과 같이 작성한다.
<sourcesyntaxhighlight lang="c">
[](int x) -> int { return x * x; }
</syntaxhighlight>
</source>
 
== 고계 함수 ==
61번째 줄:
 
예를 들어서 1에서 10까지 숫자로 이루어진 리스트의 각 원소를 제곱하고 싶다고 하자. 명령형 언어에서는 반복문을 이용하여 리스트를 훑어 가며 각 원소를 제곱하겠지만, 함수형 언어에서는 리스트를 다루는 고계 함수로 이를 처리할 수 있다. 다음은 [[하스켈]]을 이용하여 이를 수행한 예를 보여준다.
<sourcesyntaxhighlight lang="haskell">
map (\x -> x * x) [1..10]
</syntaxhighlight>
</source>
여기서 <code>[1..10]</code>은 1에서 10까지 숫자로 이루어진 [[리스트 (컴퓨팅)|리스트]]다. 고계 함수 <code>map</code>은 첫 번째 인수로 주어진 함수(여기서는 제곱을 수행하는 익명함수)를 두 번째 인수로 주어진 [[리스트 (컴퓨팅)|리스트]]의 각 원소에 적용한 결과 리스트를 반환한다. 위 코드를 수행하면 다음과 같은 결과를 얻을 수 있다.
[1,4,9,16,25,36,49,64,81,100]