Pytanie Zrozumienie Boka Haskella Wypisanie Ord


Naucz się Haskella przedstawia Bool rodzaj:

data Bool = False | True deriving (Ord)

Nie rozumiem powodu porównywania Bool.

> False `compare` True
LT
> True `compare` False
GT

Co byłoby stracone, jeśli Bool nie pochodzi od Ord?


24
2018-05-27 03:29


pochodzenie


Cóż, nie możesz mieć Map z boolami. Co można zyskać, nie mając Ord instancja? Zauważ też, że nie możesz trywialnie czerpać Ord dla dowolnego typu, który obejmuje Bool bez wcześniejszego instance Ord Bool. - Thomas M. DuBuisson
A co z funkcjami wskaźnika np. fromEnum. (elem [1,2,3]), który wynosi 1, jeśli zostanie zastosowany do elementu zbioru, a 0 w przeciwnym razie? - idontgetoutmuch
Myślę, że powinno się to nazywać "czerpaniem" Ord instancja "zamiast" pochodząca z Ord". - chaosmasttter
dzięki @chaosmasttter. Właśnie zaktualizowałem Twoją poprawkę. - Kevin Meredith


Odpowiedzi:


Bool tworzy a ograniczona krata* gdzie False jest Dolny i True jest Top. Ta ograniczona kratownica definiuje (całkowite) porządkowanie gdzie False naprawdę jest ściśle mniej niż True. (Są też jedynymi elementami tej sieci).

Operacje boolowskie and i or można również spojrzeć na jak spotykać się i Przystąpić, odpowiednio, w tej sieci. Meet znajduje największą dolną granicę, a join znajduje najniższą granicę. To znaczy że a && False = False jest to samo, co powiedzenie, że dolna granica dna i cokolwiek innego jest dnem, i a || True = True jest to samo, co powiedzenie, że górna granica góry i wszystko jest na górze. Więc spotkać się i dołączyć, które używają właściwości zamawiania booleans, są równoważne z operacjami boolowskimi, które znasz.

Możesz użyć min i max pokazać to w Haskell:

False `min` True = False -- this is the greatest lower bound
False  &&   True = False -- so is this

False `max` True = True  -- this is the least upper bound
False  ||   True = True  -- so is this

To pokazuje, że możesz zdefiniować && i ||  właśnie z pochodnych Ord instancja:

(&&) = min
(||) = max

Zauważ, że te definicje nie są równoważne w obecności inny rodzaj dna bo (&&) i (||) są zwarcie (nie ścisłe w drugim argumencie, gdy pierwszy jest False lub True, odpowiednio) podczas min i max nie są.

Również niewielka korekta: The deriving klauzula tego nie mówiBool "wywodzi sie z" Ord. Instruuje GHC do wyprowadzenia instancji typu Ord  dla Typ Bool.

* Dokładniej, a uzupełniona sieć rozdzielcza. W szczególności nadal, a algebra boolowska.


34
2018-05-27 04:08



Istnieje różnica między (&&) = min; (||) = max i typowa definicja: mają różne właściwości ścisłości, więc na przykład zachowują się inaczej w stosunku do dna ("dół" w sensie undefined itp). (&&) i (||) są zwarcie. - David Young
Słuszna uwaga. Mogę dodać zwykłe zastrzeżenie "do dołu", jeśli uważasz, że to pomogłoby. - Rein Henrichs
Czy mógłbyś powiedzieć mi znaczenie meet i join? Przeczytałem ci dwa akapity, ale nie rozumiem. W szczególności, jakie jest znaczenie least upper bound & greatest lower bound Bool? - Kevin Meredith
@ DavidsYoung: Dlaczego mieliby być inni? min i max są zdefiniowane w kategoriach compare lub operatory porównania i nie ma powodu, dla którego surowość tych musi być inna niż dla (&&) i (||) - newacct
@newacct (&&) i (||) są zdefiniowane pod względem dopasowania wzoru zwarcia. Dla compare dać wynik (na Bool przynajmniej) musi ocenić oba argumenty, ponieważ istnieje możliwość, że są one równe. Rozważ różnicę między True || undefined i True `max` undefined - David Young


The Ord instancja dla Bool staje się znacznie ważniejsza, gdy trzeba porównać wartości, które zawierają Bool gdzieś w środku. Na przykład bez niego nie moglibyśmy pisać wyrażeń takich jak:

[False,True] `compare` [False,True,False]

(3, False) < (3, True)

data Person = Person { name :: String, member :: Bool } deriving (Eq, Ord)

itp.


16
2018-05-27 05:29





To dlatego, że projektanci Haskell popełnili błąd! Nigdy nie widziałem podręcznika do matematyki, który wspomniałby o zamawianiu booleans. Tylko dlatego, że mogą to być nie znaczy z należy. Niektórzy z nas używają Haskella dokładnie dlatego, że w wielu przypadkach uniemożliwia lub chroni nas przed mylącymi / nonsensownymi rzeczami, ale nie w tym przypadku.

instance Ord Bool przyczyny a => b oznaczać, czego oczekujesz a <= b znaczyć!

Wcześniejsze argumenty przemawiające za instance Ord Bool gdzie możesz uczynić więcej typów porównywalnymi niejawnie. Kontynuując tę ​​argumentację, niektórzy mogą chcieć, aby każdy typ był porównywalny, a nawet miał słabe dynamiczne pisanie i pomijał całkowicie klasy typów. Ale chcemy, aby silne pisanie dokładnie uniemożliwiało to, co nie jest oczywiście poprawne, i instance Ord Bool pokonuje ten cel.

Co do argumentu, że Bool jest kratą ograniczoną. W przeciwieństwie do boolean: = {True, False}, w Haskell mamy Bool: = {True, False, bottom} nie jest już ograniczoną kratą, ponieważ ani True, ani False nie są elementami tożsamości w presense of bottom. Jest to związane z tymi komentarzami omawiającymi && vs min.


-1
2017-07-28 05:20



Nie podążam za twoją argumentacją. Wiele instancji monady jest niepoprawnych również w obecności dna, a mimo to wciąż ich używamy. - Lambda Fairy
W Haskell jest dość powszechne rozumowanie o rzeczach "od dołu do dołu" i dodałem do tego zastrzeżenie. Możemy to zrobić, ponieważ jest "moralnie poprawny" w tym sensie, w jakim się znajduje Szybkie i luźne rozumowanie jest moralnie poprawne (PDF): jeśli dwa terminy mają równoważną semantykę w całym języku, to mają związane z semantykę w języku częściowym, a więc możemy nadal skutecznie rozumieć semantykę w Haskell, mimo jej stronniczości. - Rein Henrichs