Подсчет алгебраических типов данных

Я читаю/слушаю презентацию Криса Тейлора по алгебраическим типам данных.

http://chris-taylor.github.io/blog/2013/02/10/the-algebra-of-algebraic-data-types/

И есть раздел о типах функций. В частности, пример

data Bool = True | False
data Trio = First | Second | Third

Учитывая закон

a -> b == B^A

Учитывая

Trio -> Bool should equal 8

Почему 8, а не 6 посредством умножения?

Если я понимаю это правильно, конкретные комбинации должны быть

First -> True
First -> False
Second -> True
Second -> False
Third -> True
Third -> False

Разве это не только 6 конкретных реализаций Trio -> Bool?

Что мне не хватает?

1 ответ

Это не полная реализация. Для полных реализаций это похоже на подсчет от 0 до 7 (что в сумме составляет 8 = 2 3) в двоичном формате, причем каждая строка каждой реализации представляет один из трех битов. Все возможности выглядят так (если мы назовем нашу функцию f):

1)

f First = False
f Second = False
f Third = False

2)

f First = True
f Second = False
f Third = False

3)

f First = False
f Second = True
f Third = False

4)

f First = True
f Second = True
f Third = False

5)

f First = False
f Second = False
f Third = True

6)

f First = True
f Second = False
f Third = True

7)

f First = False
f Second = True
f Third = True

8)

f First = True
f Second = True
f Third = True

licensed under cc by-sa 3.0 with attribution.