假设我想使用模式匹配实现列表的长度函数,那么我可以这样做:
length' :: (Num b) => [a] -> b
length' [] = 0
length' (_:xs) = 1 + length' xs
我可以用Vector
s 做类似的事情吗?
假设我想使用模式匹配实现列表的长度函数,那么我可以这样做:
length' :: (Num b) => [a] -> b
length' [] = 0
length' (_:xs) = 1 + length' xs
我可以用Vector
s 做类似的事情吗?
该vector
库的Vector
各种类型都是不透明类型,它们不公开其数据构造函数,因此您无法对它们进行模式匹配。
有一些方法可以解决这个问题,比如ViewPatterns
(正如 user2407038 的评论所提到的),但你当然不想将这些与向量一起使用,因为你可能会放弃使用向量的优势。
该vector
库的亮点在于它是基于两个概念实现的:
(1) 意味着向量不像列表那样具有自然的“头”和“尾”——列表实际上是一对头和尾。如果您要使用某种视图模式在向量顶部施加头+尾结构,您将有效地创建向量元素的单链表,这可能会触发每个节点的内存分配查看类型。
如果您过去将ViewPatterns
向量视为有效的单链表,为什么不直接将向量转换为列表呢?
无论如何,由于上面提到的设计要点,vector
您真的希望尽可能地坚持库本身提供的操作,因为它们会利用库的性能特性。
我怀疑在许多情况下测试向量的大小可能是一个次优的想法。例如,在这样的代码中:
example :: Vector something -> Vector somethingElse
example as
| Vector.null as = ...
| otherwise = ...
...我希望(但尚未验证!)这将强制实现向量as
,以便我们可以测试它是否为空,如果可以消除测试或将其移动到其他地方,则操作可能在“...”位可以与使用的上下文融合example
。