为什么任意大小的元组有用? (模板Haskell)

Why are arbitrary sized tuples useful? (Template Haskell)

introductory text for Template Haskell 中,为什么模板 Haskell 有用的示例之一是处理任意大小的元组。

任意大小的元组的用途是什么?如果数据类型相同,为什么不使用列表?而如果元组中的数据类型不同,如何扩展到任意大小?

任意一个意味着任意在编译时。因此,如果您想要包含十五个元素的元组,模板 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。此外,在这种情况下,您不确定列表是否包含三个元素。您在编译时检查得越多,您的代码就越安全(并且在许多情况下效率也更高)。

A list 在另一方面具有任意大小 在运行时 。相同的类型 - 例如 [Int] - 可以指定一个包含两个、五个、一百个或数千个整数的列表。此外,在列表的情况下,访问第 k 个元素需要 O(k) 时间。像 arrays 这样的数据结构当然可以在恒定时间内访问元素。