Ответ 1
Тип (a,b,c,d)
имеет другой профиль производительности от (a,(b,(c,(d,()))))
. Как правило, индексирование в n-кортеж принимает O(1)
, а индексирование в "hlist" из n вложенных кортежей занимает O(n)
.
Тем не менее, вы должны проверить классическую работу Олега на HLists. Использование HLists требует обширного и несколько отрывочного использования программирования уровня. Многие люди считают это неприемлемым, и он не был доступен в раннем Haskell. Вероятно, лучший способ представить HList сегодня - это GADT и DataKinds
data HList ls where
Nil :: HList '[]
Cons :: x -> HList xs -> HList (x ': xs)
Это дает каноническое вложение и позволяет писать функции, которые работают для всех экземпляров этого типа. Вы можете реализовать свой многопользовательский путь zipWith
, используя те же методы, что и в printf. Более интересная головоломка состоит в том, чтобы сгенерировать соответствующие линзы для этого типа (подсказка: использовать типы типов naturals и типы семейств для индексации).
Я подумал о написании библиотеки HList, которая использовала массивы и unsafeCoerce
под капотом, чтобы получить кортеж как производительность, одновременно придерживаясь общего интерфейса. Я этого не делал, но это не должно быть слишком сложно.
ИЗМЕНИТЬ: чем больше я думаю об этом, тем более склонным я должен что-то взломать, когда у меня будет время. Повторяющаяся проблема копирования Андреаса Росберга упоминается, вероятно, может быть устранена с использованием потокового синтеза или аналогичных методов.