2012-04-18 3 views
5

Я часто собираю несколько значений в кортежах, так как я считаю кортежи естественным типом для этого. Однако кортежи не являются строгими. Так считаютВложенные 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.

(непустые кортежи типы типа-конструкторы?)

ответ

6

Рассмотрим:

data B = B !Int 

data C = C !(B, B) 

data D = D !B !B 

b0 = B 7 
b1 = B 4 

c = C (b0, b1) 

d = D b0 b1 

где

data (,) a b = (a,b) 

GHC счастливо стирания гнездились, строгие Конструкторы (!B), и он сделает C строгим в своем первом поле, оптимизируя до:

b0 = B 7 
b1 = B 4 

c = C b0 b1 

d = D 7 4 

Однако, самое главное, поля (,) не являются строгими, поэтому GHC их не распаковывает. Кроме того, они полиморфны, поэтому они не могут распаковывать их, даже если они строгие.

Работа для первой части - использование строгих кортежей. Обходной путь для второй части состоит в использовании self-specializing tuples (например, семейства типов, которые специализируют кортежи).


Обратите внимание, что с помощью кортежей синтаксиса в этом стиле несет накладные расходы - они вводят уровень косвенности, который должен быть оптимизирован прочь. Таким образом, он несколько унииоматичен.

+0

В моем вопросе исправлена ​​ошибка: данные B должны быть данными B = B! A. Итак, в C я должен использовать свой собственный специализированный тип, который имеет строгие поля, а не кортеж? Я надеялся, что GHC может продолжать распаковываться после поиска кортежа, поэтому мне не нужно писать много специализированных типов данных для каждого поля. (Но, поскольку я собираю значения в кортежах, у меня есть, вероятно, некоторое абстрактное представление о наборе значений, так что тогда я, вероятно, должен использовать специализированную версию ...) – telephone

+0

Это было бы, если кортежи не были полиморфными. Ранее я писал об этой проблеме: http://donsbot.wordpress.com/2009/10/11/self-optimizing-data-structures-using-types-to-make-lists-faster/ –

+0

Как я вижу из примеры в GHC-doc, пара, используемая как строковое поле в типе данных, будет сглажена. – telephone