С произвольно один означает произвольное во время компиляции. Поэтому, если вы хотите кортежи с пятнадцатью элементами, шаблон Haskell будет генерировать функцию для кортежа с пятнадцатью элементами. Однако после компиляции число элементов фиксировано. Преимущество использования кортежа состоит в том, что вы можете получить доступ к каждому элементу за постоянное время O (1). Таким образом, вы можете использовать систему типов для обеспечения соблюдения кортежа по-прежнему содержит фиксированное количество элементов.
Кроме того, sel
в примере может работать с кортежами, где элементы имеют произвольные типы. Например sel 2 3
сгенерирует функцию:
$(sel 2 3) :: (a,b,c) -> b
$(sel 5 5) :: (a,b,c,d,e) -> e
в то время как если вы используете список [a]
, это означает, что список может содержать только данные для определенного типа:
(!!3) :: [a] -> a
так что все элементы имеют тип a
. Кроме того, в этом случае вы не уверены, что в списке будет три элемента. Чем больше вы можете проверить во время компиляции, тем более безопасным будет ваш код (и во многих случаях более эффективный).
список с другой стороны, имеет произвольный размер во время выполнения. Один и тот же тип - например, [Int]
- может указывать список с двумя, пятью, целыми или целыми целыми числами. Кроме того, в случае списка доступ к элементу k требует O (k) времени. Существуют такие структуры данных, как массивы, которые, конечно же, могут обращаться к элементам в постоянное время.
Я чувствую необходимость упомянуть [библиотеку «tuple-th»] (http://hackage.haskell.org/package/tuple/th), которую я нашел очень полезной в своей практике. –