Я часто собираю несколько значений в кортежах, так как я считаю кортежи естественным типом для этого. Однако кортежи не являются строгими. Так считаютВложенные UNPACK в GHC
data A
data B =
B !A
data C =
C !(B, B)
data D =
D !B !B
С -funbox-strict-fields
и оптимизации, распаковывает вложены. Будет ли кортеж в C
быть распакован в C A A
как с D
, или просто C B B
? Вот ссылка в GHC-doc: 7.16. Pragmas.
(непустые кортежи типы типа-конструкторы?)
В моем вопросе исправлена ошибка: данные B должны быть данными B = B! A. Итак, в C я должен использовать свой собственный специализированный тип, который имеет строгие поля, а не кортеж? Я надеялся, что GHC может продолжать распаковываться после поиска кортежа, поэтому мне не нужно писать много специализированных типов данных для каждого поля. (Но, поскольку я собираю значения в кортежах, у меня есть, вероятно, некоторое абстрактное представление о наборе значений, так что тогда я, вероятно, должен использовать специализированную версию ...) – telephone
Это было бы, если кортежи не были полиморфными. Ранее я писал об этой проблеме: http://donsbot.wordpress.com/2009/10/11/self-optimizing-data-structures-using-types-to-make-lists-faster/ –
Как я вижу из примеры в GHC-doc, пара, используемая как строковое поле в типе данных, будет сглажена. – telephone