2012-09-26 11 views
9

Czy wszystkie przykłady Haskella Applicative Typeclass, które otrzymujemy z platformą Haskell, zostały udowodnione, że spełniają wszystkie prawa aplikacyjne? Jeśli tak, gdzie znajdujemy te dowody?Dowody stosowania praw dla instancji haskell

Kod źródłowy Control.Applicative nie zawiera żadnego dowodu na to, że przepisy dotyczące stosowania różnych instancji nie istnieją. To po prostu mówi, że

-- | A functor with application. 
-- 
--Instances should satisfy the following laws: 

to wtedy po prostu stwierdza, przepisy ustawowe w komentarzach.

Znalazłem podobny przypadek dla wystąpień innych czcionek (Alternatywa i Monada).

Czy użytkownicy tych bibliotek mają samodzielnie zweryfikować te prawa?

Ale zastanawiałem się, czy rygorystyczne dowody tych praw zostały podane przez deweloperów gdzie indziej?

Ponownie, zdaję sobie sprawę z tego, że rygorystyczny dowód stosowania prawa (w Monadzie) dla IO Monad, który obejmuje rozmowę ze światem zewnętrznym, może być bardzo złożony.

Dzięki.

Odpowiedz

11

Tak, ciężar dowodu spoczywa wyłącznie na autorach bibliotek. Istnieje kilka przykładów implementacji, które naruszają te prawa. Kanonicznym przykładem naruszenia prawa jest ListT, co nie jest zgodne z prawami monady dla większości bazowych monad (zob. examples). Daje to bardzo błędne zachowanie i nikt tak naprawdę nie używa ListT jako wyniku.

Jestem prawie pewien, że większość tego rodzaju dowodów nie została wyryta w kamieniu w standardowym miejscu. Większość dowodów została po prostu powtórzona i sprawdzona na śmierć przez różnych ciekawych członków społeczności, więc po pewnym czasie wiemy, które implementacje nie spełniają ich praw.

Aby podać konkretny przykład, gdy piszę pipes bibliotekę, muszę udowodnić, że mój pipes spełniać Category ustawowe, ale ja po prostu zachować te dowody w pliku tekstowym lub hpaste dla przyszłych rekord jeśli ktoś prosi je. Włączenie ich do źródła nie jest możliwe, ponieważ mogą być bardzo długie, zwłaszcza w przypadku praw zrzeszeniowych.

Uważam jednak, że dobrą praktyką może być, jeśli to możliwe, sprawdzanie sprawdzonych plików w oryginalnych repozytoriach, aby użytkownicy mogli się do nich odwołać w razie potrzeby.

+3

Przypuszczam, że istnieje również możliwość napisania kodu w systemie takim jak Agda lub Coq, a następnie wyodrębnienia z niego kodu źródłowego Haskella. Szczerze mówiąc nie próbowałem tego, ale wynik byłby całkowicie formalnym dowodem wymaganych właściwości. –

+1

@Gabriel Dzięki.Podobnie jak w przypadku ListT, jak wiele innych wdrożeń zauważyło, że zepsuło się? Czy istnieje lista niewłaściwych implementacji instancji? także, jeśli uwzględnienie całego dowodu nie jest możliwe ze względu na długość, wówczas możliwe jest umieszczenie hiperłącza w dowodzie w kodzie źródłowym i umieszczenie tekstu dowodowego na Haskell.org w ramach dokumentacji. – user1308560

+1

@ user1308560 ListT jest jedynym w standardowych bibliotekach, które znam z góry mojej głowy. Idea połączenia ma sens. –

1

Istnieje doskonała biblioteka checkers, która zapewnia właściwości QuickCheck do sprawdzania przepisów.

1

Biblioteka eksperymentalny ghc-proofs pozwala na użycie kompilatora do weryfikacji takich ustaw dla Ciebie:

app_law_2 a b (c :: Succs a) = pure (.) <*> a <*> b <*> c 
          === a <*> (b <*> c) 

To działa tylko w nielicznych przypadkach, takich jak ten opisany in my blog post, a najlepiej jest postrzegane jako eksperyment , a nie gotowe narzędzie.