gpt4 book ai didi

haskell - 如何在 Haskell 中对空向量进行模式匹配?

转载 作者:行者123 更新时间:2023-12-04 20:35:28 25 4
gpt4 key购买 nike

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

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

我可以用 Vector 做类似的事情吗?年代?

最佳答案

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

有一些方法可以解决这个问题,例如 ViewPatterns (正如 user2407038 的评论所提到的),但您当然不想将这些与向量一起使用,因为您可能会放弃使用向量的优势。
vector 的亮点库是它是基于两个概念实现的:

  • 向量被物化为固定大小的连续内存数组,它提供比单链表或树更好的内存局部性;
  • 大量向量操作是根据可熔流实现的,其操作编译为不为中间向量分配内存的循环。

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

    如果您使用 ViewPatterns要将向量视为有效的单链表,为什么不将向量转换为列表?

    无论如何,由于上面提到的设计要点,与 vector你真的想尽可能地坚持 the operations provided by the library itself ,因为它们将利用库的性能特性。

    我怀疑在许多情况下测试向量的大小可能是一个次优的想法。例如,在这样的代码中:
    example :: Vector something -> Vector somethingElse
    example as
    | Vector.null as = ...
    | otherwise = ...

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

    关于haskell - 如何在 Haskell 中对空向量进行模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36627318/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com