Ответ 1
Bool
образует ограниченную решетку , где False
внизу, а True
- верхняя. Эта ограниченная решетка определяет (полный) порядок, где False
действительно строго меньше True
. (Они также являются единственными элементами этой решетки.)
Булевы операции and
и or
также могут рассматриваться как встречающиеся и объединенные соответственно в этой решетке. Встреча находит наибольшую нижнюю границу, и соединение находит наименьшую верхнюю границу. Это означает, что a && False = False
- это то же самое, что и нижняя граница дна и всего остального - внизу, а a || True = True
- это то же самое, что и верхняя граница вершины, а что-то верхняя. Таким образом, встреча и объединение, которые используют свойство упорядочения логических элементов, эквивалентны булевым операциям, с которыми вы знакомы.
Вы можете использовать min
и max
, чтобы показать это в 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
Это показывает, что вы можете определить &&
и ||
только из производного экземпляра Ord
:
(&&) = min
(||) = max
Обратите внимание, что эти определения не эквивалентны при наличии другого типа дна, поскольку (&&)
и (||)
являются короткозамкнутыми (нестрогими в второй аргумент, когда первый False
или True
, соответственно), а min
и max
не являются.
Кроме того, небольшая поправка: предложение deriving
не говорит о том, что Bool
"происходит от" Ord
. Он инструктирует GHC получить экземпляр класса Ord
для типа Bool
.
* Более конкретно, дополненная распределительная решетка. Более конкретно, булева алгебра .