Semigroup

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

반응형

https://en.wikipedia.org/wiki/Magma_(algebra)

 

https://blog.ploeh.dk/2017/10/05/monoids-semigroups-and-friends/

 

지난 시간에 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 연산자가 될수 있다. 

 

관련영상

https://youtu.be/IVklL4DfciQ

 

반응형

'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