Monuses and Heaps
모누스(monus)는 부분적 뺄셈 연산을 지원하는 순서 있는 모노이드(ordered monoid)로, 그래프 탐색이나 정렬 알고리즘에서 가중치 기반 탐색에 유용한 대수 구조입니다.
이 구조를 활용해 페어링 힙(pairing heap)을 구현하면, 각 노드에 절대값 대신 부모와의 가중치 차이만 저장하여 힙 속성을 자연스럽게 만족시키고, 루트 노드 가중치 변경만으로 모든 자식 노드 가중치를 효율적으로 조정할 수 있습니다.
Haskell에서 모누스 타입 클래스를 정의하고, 이를 기반으로 페어링 힙의 병합, 삽입, 최소값 추출 연산을 구현하여 효율적인 정렬과 그래프 탐색이 가능합니다.
또한, 동일한 가중치에 대해 원래 순서를 유지하는 안정적 정렬(stable sort)을 위해, 키에 위치 오프셋을 결합한 Key 모누스를 도입하여 힙 내에서 위치 정보를 국소적으로 관리함으로써 안정성을 보장합니다.
마지막으로, 이 모누스 기반 힙 구조는 Phases라는 Applicative 변환기 구현에도 활용되어, 임의의 순서 있는 키를 가진 효과들의 순서 재배열을 효율적이고 안정적으로 처리할 수 있음을 보여줍니다.