2014-11-22 1 views
5

정의 또는 monoid에 따르면 이항 연산자는 연관되어야합니다. A op (B op C) == (A op B) op C. 하스켈Haskell - Implementing Monoid 연산자가 연관되지 않은 경우 어떻게 될 것입니까?

base mconcat definition은 다음과 같습니다

mconcat = foldr mappend mempty 

나는 mconcat 기능의 구현 세부 사항을 알고 있기 때문에, 나쁜 아무것도 정의하고 함수가 연관되지 않는 경우 가짜 monoids을 사용 될까? 예를 들어 빼기 또는 나눗셈을위한 인스턴스 정의와 같습니다.

유용한 정보입니까, 아니면 요점을 놓칠 수 있습니까?

답변

11

유형 안전성 측면에서 나쁜 점은 없습니다. 귀하의 프로그램은 여전히 ​​충돌하지 않습니다.

그러나 Monoid 인스턴스에 의존하는 데이터 구조는 예상치 못한 결과를 초래할 수 있습니다.

삽입시 균형을 다시 조정하고 Monoid 인스턴스를 사용하여 요소를 결합하는 방법을 제공하는 트리를 생각해보십시오. 그러면 내부 작업으로 간주되어 보이지 않는 재조정이 관찰 가능해지며 참조 투명성은 동일한 입력 (숨겨진 내부까지)이지만 다른 출력은 "도덕적으로 손상"됩니다.

+1

나는 그것이 충돌보다 더 나쁘다고 주장 할 것이다. 그러나 누군가가'a- (b-c) == (a-b) -c'가 보유해야한다고 주장하고 싶다면 주위에 방법이 없다고 생각합니다. –

관련 문제