2022. 9. 21. 00:00ㆍCSharp/Functional Programming
지난 시간에 Magma 에 대해 알아 보았다.
https://yogingang.tistory.com/366
자 Magma 는 덧셈 또는 뺄셈과 같이 동작한 후 Magma 의 모든 요소가 여전히 동일한 유형임을 보장하는 집합이다.
그렇다면 Semigroup란 무엇인가?
Semigroup 이 되려면 위 그림에서 보았듯이 일단 Magma 의 조건을 만족해야 한다.
그리고 다음 규칙이 추가 된다.
a, b 및 c 가 집한 S 의 구성원이고 ● 가 이진 연산일 경우 (a●b)●c 는 a●(b●c) 와 같아야 한다.
그리고 두 결과 모두 S 의 구성원 이어야 한다.
Semigroup: a ∈ S, b ∈ S, c ∈ S --> (a·b)·c = a·(b·c) ∈ S
이러한 조건을 FP 세게에서는 연관성(associativity) 이라고 부른다.
사칙 연산을 다시 예로 들어 보자
5 * 4 * 2 == 40
(5*4)*2 == 5*(4*2)
자 곱셈은 Semigroup 임을 알수 있다.
하지만 나눗셈은 Semigroup 이 아니다.
24/4/2 == 3
(24/4)/2 != 24/(4/2)
예제를 통해 확인해 보자
public int AddSemigroup(int x, int y, int z) => x + y + z;
public int MulltiSemigroup(int x, int y, int z) => x * y * z;
public int SubNotSemigroup(int x, int y, int z) => x - y - z;
public int DivNotSemigroup(int x, int y, int z) => x / y / z;
Console.WriteLine(AddSemigroup(1,2,3) == AddSemigroup(3,2,1));
Console.WriteLine(MulltiSemigroup(1, 2, 3) == MulltiSemigroup(3, 2, 1));
Console.WriteLine(SubNotSemigroup(1, 2, 3) == SubNotSemigroup(3, 2, 1));
Console.WriteLine(DivNotSemigroup(1, 2, 3) == DivNotSemigroup(3, 2, 1));
물론 편하게 계산하기 위해 우선순위를 가지고 test 하지는 않았고 아예 다른 값을 x, y , z 에 할당하여
순서를 바꾼것 같은 효과를 주었다. 결과적으로 priority 를 준것과 같은 효과를 내니 이걸로 test 해보자
문자열의 concat 도 같은데 position 은 그대로 두고 우선순위만 바꾸어 문자열을 합친다고 해보자
public string StringConcat(string x, string y, string z) => x + y + z;
public string StringConcat2(string x, string y, string z) => (x + y) + z;
public string StringConcat3(string x, string y, string z) => x + (y + z);
string a = "Hello";
string b = " Yogingang";
string c = " Nice To Meet You";
Console.WriteLine(StringConcat(a, b, c) == StringConcat2(a, b, c));
Console.WriteLine(StringConcat(a, b, c) == StringConcat3(a, b, c));
Console.WriteLine(StringConcat2(a, b, c) == StringConcat3(a, b, c));
자 위함수들에서 + 라는 문자열을 더하는 연산자는 Semigroup 연산자가 될수 있다.
관련영상
'CSharp > Functional Programming' 카테고리의 다른 글
Quasigroups (유사군) (0) | 2022.09.23 |
---|---|
Monoid (0) | 2022.09.22 |
Magma (2) | 2022.09.20 |
순수 함수 (Pure Function) (0) | 2022.09.19 |
Expression, Method chaining with Extension methods (0) | 2022.09.16 |