Семантика и представление
Эти два типа нельзя использовать взаимозаменяемо.
Тип
data Bool = False | True
является поднятым типом.Это означает, что переменная x :: Bool
все еще может быть оценена (например, thunk).Поэтому он будет представлен в виде указателя.
В отличие от него
(# (# #) | (# #) #)
не является поднятым, и в действительности может иметь только два значения и будет представлен как просто целое число машины.
Эффективность пространства
Это, однако, не означает, что последний более эффективен в пространстве: поскольку True
и False
являются нулевыми конструкторами (они не принимают аргументов),они существуют раз и навсегда в статическом коде вашей программы, и указатели просто указывают на них.Таким образом, во всех случаях стоимость составляет одно машинное слово.
Эффективность времени выполнения
Вариант без коробки может быть немного более эффективным, чем Bool
:
Для Bool
код должен сначала проверить это уже вычислено? , а затем он может переходить на том конструкторе, в котором он находится.
Разветвление довольно эффективно: код делаетдля этого не нужно следовать указателю: «тег указателя» в младших битах адреса указателя будет указывать, какой это конструктор.Тем не менее, существует небольшая стоимость маскировки других битов.
В варианте без коробки, ну, это просто 0
или 1
, и проверка thunk не требуется.
Распаковка в типах данных
Если вы определили тип данных как этот
data Foo = Foo (-# UNBOX #-} !Bool
, вы должны получить точно такой же результат, как если бы вынапишите
data Foo = Foo (# (# #) | (# #) #)
, так как это было основной целью расширения суммы без коробки.
Распаковка в функциях
Если вы определяете строгую функцию в Bool
аргумент, например
foo True = "Hello"
foo False = "World!"
, тогда я мог представить (но не проверял), что компилятор оптимизирует это в worker , который принимает (# (# #) | (# #) #)
и оболочку который заботится о проверке.Оболочка может затем встроиться в сайты использования, где используется foo
, и все может закончиться в терминах (# (# #) | (# #) #)
.
Заключение
Не беспокойтесь.