如何模式匹配Haskell中的空向量?

frm*_*aul 5 haskell pattern-matching pattern-synonyms

假设我想使用模式匹配实现列表的长度函数,那么我可以这样做:

length' :: (Num b) => [a] -> b  
length' [] = 0  
length' (_:xs) = 1 + length' xs  
Run Code Online (Sandbox Code Playgroud)

我可以用Vectors 做类似的事吗?

Lui*_*las 4

vector库的各种类型Vector是不透明类型,它们不公开其数据构造函数,因此您无法对它们进行模式匹配。

\n\n

有很多方法可以解决这个问题,例如ViewPatterns(如 user2407038 的评论所提到的),但您当然不想将它们与向量一起使用,因为您可能会放弃使用向量的优势

\n\n

该库的亮点vector在于它是基于两个概念实现的:

\n\n
    \n
  1. 向量被具体化为固定大小的连续内存数组,它提供比单链表或树更好的内存局部性;
  2. \n
  3. 大量向量操作是根据可熔流来实现的,这些流的操作编译为不为中间向量分配内存的循环。
  4. \n
\n\n

(1) 意味着向量不具有自然的“头”和“尾”,就像列表 do\xe2\x80\x94 一样,列表实际上是一对头和尾。如果您要使用某种视图模式在向量顶部强加头+尾结构,那么您将有效地创建向量元素的单链表,这可能会触发内存分配视图类型的每个节点。

\n\n

如果您过去ViewPatterns将向量视为有效的单个链表,为什么不将向量转换为列表呢?

\n\n

无论如何,由于上面提到的设计要点,vector您确实希望尽可能多地坚持库本身提供的操作,因为它们将利用库的性能特征。

\n\n

我怀疑在许多情况下测试向量的大小很可能不是一个最佳的想法。例如,在这样的代码中:

\n\n
example :: Vector something -> Vector somethingElse\nexample as \n  | Vector.null as = ...\n  | otherwise      = ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

...我希望(但尚未验证!)这将强制向量as被具体化,以便我们可以测试它是否为空,如果可以消除测试或将其移动到其他地方“...”位中的操作可能与example使用的上下文融合。

\n