В конце Теория категорий 8.2 Бартош Милевски показывает несколько примеров соответствия. между логикой, теорией категорий и системами типов.
Я бродил, что соответствует логическому оператору xor. я знаю это
a xor b == (a ∨ b) ∧ ¬(a ∧ b) == (a ∨ b) ∧ (¬a ∨ ¬b)
Поэтому я решил только часть проблемы: a xor b
соответствует (Either a b, Either ? ?)
. Но каких двух типов недостает?
Кажется, что написание xor
на самом деле сводится к тому, как писать not
.
Так что такое ¬a
? Насколько я понимаю, a
логически верно, если существует элемент (по крайней мере, один) типа a
. Итак, чтобы not a
было истинным, a
должно быть ложным, т.е. должно быть Void
. Поэтому мне кажется, что есть две возможности:
(Either a Void, Either Void b) -- here I renamed "not b" to "b"
(Either Void b, Either a Void) -- here I renamed "not a" to "a"
Но в этом последнем абзаце у меня такое чувство, что я просто ошибаюсь.
2 ответа
Стандартный трюк для отрицания - использовать -> Void
, поэтому:
type Not a = a -> Void
Мы можем построить полного обитателя этого типа именно тогда, когда a
сам является доказуемо необитаемым типом; если есть жители a
, мы не можем построить общего жителя этого типа. Для меня это звучит отрицанием!
Это означает, что ваше определение xor выглядит следующим образом:
type Xor a b = (Either a b, (a, b) -> Void) -- (a ∨ b) ∧ ¬(a ∧ b)
type Xor a b = (Either a b, Either (a -> Void) (b -> Void)) -- (a ∨ b) ∧ (¬a ∨ ¬b)
Я думаю, что XOR представлен просто Either
, и это These
, представляющий ИЛИ.
XOR B - это либо A, либо B, но не оба сразу, и это то, что есть Either
.
data Either a b = Left a | Right b
OR B - это либо A, либо B, либо оба A и B, и это то, что есть These
.
data These a b = This a | That b | These a b
Похожие вопросы
Связанные вопросы
Новые вопросы
haskell
Haskell — это чисто функциональный язык программирования со строгой статической типизацией, отложенными вычислениями, обширной поддержкой параллелизма и параллелизма, а также уникальными возможностями абстракции.