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

时间:2016-04-14 15:15:37

标签: haskell pattern-matching pattern-synonyms

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

length' :: (Num b) => [a] -> b  
length' [] = 0  
length' (_:xs) = 1 + length' xs  

我可以使用Vector做类似的事吗?

1 个答案:

答案 0 :(得分:3)

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

有很多方法可以解决这个问题,例如ViewPatterns(由user2407038提及的评论),但你肯定想要将这些用于向量,因为你可能< em>抛弃使用向量的优势。

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

  1. 向量被实现为固定大小的连续内存数组,它提供比单链表或树更好的内存位置;
  2. 大量的向量操作是根据可熔流实现的,其操作编译为不为中间向量分配内存的循环。
  3. (1)意味着一个矢量没有一个自然的“头部”,而“尾部”就像列表一样,字面上一对头部和一个尾部。如果你要使用某种视图模式在矢量顶部强加一个head + tail结构,你就可以有效地创建一个矢量元素的单链表,这可能会触发每个节点的内存分配。查看类型。

    如果您使用ViewPatterns将矢量视为实际上是单个链表,那么为什么不将矢量转换为列表呢?

    在任何情况下,由于上面提到的设计点,vector你真的想尽可能地坚持the operations provided by the library itself,因为他们会利用图书馆的表演功能。

    我怀疑在很多情况下测试矢量大小的可能性很小。例如,在这样的代码中:

    example :: Vector something -> Vector somethingElse
    example as 
      | Vector.null as = ...
      | otherwise      = ...
    

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