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

时间:2016-01-14 12:14:35

标签: list haskell tuples template-haskell

introductory text for Template Haskell中,为什么模板Haskell有用的一个例子是使用任意大小的元组。

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

1 个答案:

答案 0 :(得分:12)

使用任意,意味着在编译时任意 。因此,如果你想要带有十五个元素的元组,模板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 -th元素需要 O(k)时间。像 arrays 这样的数据结构当然可以在恒定时间内访问元素。