在introductory text for Template Haskell中,为什么模板Haskell有用的一个例子是使用任意大小的元组。
任意大小的元组的目的是什么?如果数据类型相同,为什么不使用列表?如果元组中的数据类型不同,如何将其扩展为任意大小?
答案 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 这样的数据结构当然可以在恒定时间内访问元素。