2014-11-22 7 views
5

Zgodnie z definicją lub monoidem, operator dwójkowy musi być asocjacyjny, np. A op (B op C) == (A op B) op C.Haskell - Implementacja Monoid, co się dzieje, gdy operator nie jest asocjacyjny

base mconcat definition w Haskell jest:

mconcat = foldr mappend mempty 

Ponieważ znam szczegółów prowadzonych działań mconcat, że coś złego się stało z definiowania i używania fałszywych monoids gdzie funkcja nie jest łączne? Podobnie jak na przykład definiowanie instancji do odejmowania lub dzielenia.

Czy to może być przydatne, czy też nie rozumiem?

Odpowiedz

11

Nic złego się nie stanie, jeśli chodzi o bezpieczeństwo typu: Twoje programy nadal nie ulegają awarii.

Ale struktura danych oparta na instancji Monoid może dawać nieoczekiwane lub błędne wyniki.

Rozważ drzewo, które jest wyważone po wstawieniu, i które umożliwia łączenie elementów przy użyciu ich instancji Monoid. Wtedy ponowne równoważenie, które ma być operacją wewnętrzną i niewidoczną, staje się obserwowalne, a przejrzystość odniesienia jest "moralnie zepsuta" - to samo wejście (do rzekomo ukrytych elementów wewnętrznych), ale inne wyjście.

+1

Powiedziałbym, że to jest gorsze niż upaść. Ale myślę, że nie da się tego obejść, jeśli ktoś chce nalegać, aby 'a- (b-c) == (a-b) -c' miał ... –

Powiązane problemy