Тип (a,b,c,d)
имеет различный профиль производительности от (a,(b,(c,(d,()))))
. Как правило, индексирование в n-кортеж принимает O(1)
, а индексирование в «hlist» из n вложенных кортежей принимает O(n)
.
Тем не менее, вы должны проверить классические работы Олега на HLists. Использование HLists требует обширного и несколько отрывочного использования программирования уровня. Многие люди считают это неприемлемым, и он не был доступен в раннем Haskell. Возможно, лучший способ, чтобы представить HList сегодня с GADTs и DataKinds
data HList ls where
Nil :: HList '[]
Cons :: x -> HList xs -> HList (x ': xs)
Это даст каноническое вложение, и позволяет писать функции, которые работают для всех экземпляров этого типа. Вы можете реализовать свой многопользовательский способ zipWith
, используя те же методы, что и в printf. Более интересная головоломка состоит в том, чтобы сгенерировать соответствующие линзы для этого типа (подсказка: использовать типы типов naturals и типы семейств для индексации).
Я рассмотрел возможность создания библиотеки HList, которая использовала массивы и unsafeCoerce
под капотом, чтобы получить кортеж как производительность, придерживаясь общего интерфейса. Я этого не делал, но это не должно быть слишком сложно.
EDIT: чем больше я думаю об этом, тем более склонным я должен что-то взломать, когда у меня есть время. Повторяющаяся проблема копирования Андреаса Росберга упоминается, вероятно, может быть устранена с использованием потокового синтеза или аналогичных методов.
http://stackoverflow.com/questions/14621559/n-ary-tuples-vs-pairs –