Functional Programming 의 두가지 기본 개념

2022. 9. 12. 00:00CSharp/Functional Programming

반응형

함수형 프로그래밍에서 First (일급) 이란 어떤 의미 일까?

First-class functions

: 다른 함수의 입력 또는 출력으로 사용하거나 변수 또는 컬렉션에 저장 할 수 있는 모든것들

 

그렇다면 c# 에서 함수와 class 는 First 라고 할 수 있다. 

여기서 잠깐 함수가 어떻게 First 야? 라고 할 수도 있다. 

다음을 확인하자

Func<int, bool> isEven = n => n % 2 == 0;
var list = Enumerable.Range(1, 10);
var even = list.Where(isEven);
foreach (var item in even)
	Console.WriteLine(item);

isEven 은 function 이고 이 function 을 입력 값으로 사용하고 있다.  물론 출력으로도 가능 하다.

그러므로 c# 에서 function 은 First-class Citizen 이라고 할 수 있다. 

그렇다 그리 어려운 개념은 아니다. 

 

Avoiding changing state

: 한 번 생성된 객체는 절대 변경되지 않으며 변수를 재할당 해서는 안된다.

 

자 여기에서 c# (java 등등) 류 언어의 가장 큰 단점이 있다. 기본적으로 c#은 모든것이 변경 가능하다.

var original = new List<int>() { 1, 7, 4, 3 };
PrintItems(original);
original.Sort();
PrintItems(original);

위와 같은 경우 sort 이후에 original 의 값이 변경된다. 

즉 원본에 변경을 가한다는 것이다. 

이것은 Thread 를 통해서 뭔가 작업을 하게 된다면 문제가 발생한다.

var numbers = Enumerable.Range(-10000, 20001).ToList();
Action task1 = () => { Console.WriteLine(numbers.Sum()); };
Action task2 = () => { numbers.Sort(); Console.WriteLine(numbers.Sum()); };
Parallel.Invoke(task2,task1, task1, task2, task1, task2, task2, task1);

실행하게 되면 다음과 유사한 오류가 발생 할 것이다.

항상 0 이어야 하는데 5번째 값이 6592가 되었고 AggregateException 을 보내주었다. 

dotnet version 별로 무시하고 잘못된 값이 나오는 것도 있을것이고

최신 버전에 가까울 수록 저렇게 collection 이 변경되었다는 경고와 함께 Exception 을 throw 할 것이다. 

 

그렇다면 이러한 것을 예방 할 수 는 없을까?

제일 위의 sort 문제는 아래와 같이 변경해 보자

 

int[] original =new List<int>() { 1, 7, 4, 3 };
PrintItems(original);
var sorted = original.OrderBy(x => x);
PrintItems(original);

이제 원본에 값이 변경 되지 않는것을 확인 할 수 있다. 

 

Thread 문제는 다음과 같이 변경해 보자

var numbers = Enumerable.Range(-10000, 20001).ToList();
Action task1 = () => { Console.WriteLine(numbers.Sum()); };
Action task2 = () => { Console.WriteLine(numbers.OrderBy(x => x).Sum()); };
Parallel.Invoke(task2, task1, task1, task2, task1, task2, task2, task1);

잘못된 값을 표시하지 않고 에러가 나지 않는다.

 

즉 c# 에서는 Linq extension 을 이용하여 Functional Programming 을 돕고 있다.

언어의 한계성을 기능으로 커버한 대표적인 경우이다. 

 

관련 영상

https://youtu.be/dQKXWesM5WU

반응형

'CSharp > Functional Programming' 카테고리의 다른 글

순수 함수 (Pure Function)  (0) 2022.09.19
Expression, Method chaining with Extension methods  (0) 2022.09.16
Functors (Map, Filter, Reduce)  (0) 2022.09.15
Higher Order Function  (0) 2022.09.14
Immutable type or object  (0) 2022.09.13