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

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

http://chris-taylor.github.io/blog/2013/02/10/the-алгебра-из-алгебраических-данных-типов/

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

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?

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


person Mark Canlas    schedule 28.05.2014    source источник


Ответы (1)


Это не полные реализации. Для полных реализаций это похоже на подсчет от 0 до 7 (всего 8 = 23 чисел) в двоичном формате, при этом каждая строка каждой реализации представляет один из трех битов. Все возможности выглядят так (если мы вызовем нашу функцию 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
person David Young    schedule 28.05.2014