【问题标题】:Accessing positions in a Ziplist访问 Ziplist 中的位置
【发布时间】:2022-01-10 11:33:57
【问题描述】:

我刚刚发现!! 运算符仅用于列表:

(!!) :: [a] -> Int -> a

所以我在 hoogle 上搜索了替代品:

我很惊讶没有找到一个!

所以我问:

  1. 在不将其转换回列表的情况下,按索引访问 ziplist 的方法是什么?
  2. 什么 hoogle 搜索会找到它

当然,回答 1 对回答 2 大有帮助,因为我有类型签名

【问题讨论】:

  • ziplist 与列表本质上是一样的,将其转换为列表是一个非常便宜的操作。只是 Applicative 实例不同。您可以定义:at zl n = let xs = getZipList zl in xs !! n;但如果您打算将索引作为主要访问模式,则将 (zip) 列表转换为 Vector 可能更有效。

标签: list haskell types


【解决方案1】:

ZipListnewtype,因此没有 转换。它只是同一个列表。

newtype ZipList a = ZipList { getZipList :: [a] }

正如报告在section 4.2.3 Datatype Renamings 中所述,

newtype cx => T u1 … uk = N t 形式的声明引入了一种新类型,其表示与现有类型相同

(强调我的)。当代码运行时,ZipList 标记根本不存在。因此,

作为说明,将 ZipList Int 值视为 [Int] 值是完全可以的。观察:

GHCi> coerce (ZipList [1,2,3] :: ZipList Int) :: [Int]
[1,2,3]
it :: [Int]

因此,数据构造函数ZipList 只是一个编译时标记,我们用它来声明要使用哪个应用程序实现的意图。具体来说,是压缩的,而不是嵌套循环的(常规的[])。

至于!! 本身,应该避免。使用不断增长的索引值重复调用它会导致二次行为。可以使用任意数量的高阶函数来代替,或者如果需要可以编码直接递归,逐个处理列表的元素,而无需为每个元素从头开始重新跟踪列表。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多